Patchwork [Qemu-stable,v3] tcg: Fix occasional TCG broken problem when ldst optimization enabled

login
register
mail settings
Submitter Aurelien Jarno
Date March 22, 2013, 10:11 p.m.
Message ID <20130322221101.GB4268@ohm.aurel32.net>
Download mbox | patch
Permalink /patch/230280/
State New
Headers show

Comments

Aurelien Jarno - March 22, 2013, 10:11 p.m.
On Fri, Mar 22, 2013 at 09:50:17PM +0900, Yeongkyoon Lee wrote:
> is_tcg_gen_code() checks the upper limit of TCG generated code range wrong, so
> that TCG could get broken occasionally only when CONFIG_QEMU_LDST_OPTIMIZATION
> enabled. The reason is code_gen_buffer_max_size does not cover the upper range
> up to (TCG_MAX_OP_SIZE * OPC_BUF_SIZE), thus code_gen_buffer_max_size should be
> modified to code_gen_buffer_size.
> 
> CC: qemu-stable@nongnu.org
> Signed-off-by: Yeongkyoon Lee <yeongkyoon.lee@samsung.com>
> ---
> 
> Here's the promised patch with Aurelien Jarno for TCG broken problem, which
> is supposed to be applied to 1.3.x and 1.4.x releases as well as master.
> Thanks to Aurelien Jarno and Stefan Weil.
> 
> v2: Fix source comment
> v3: Inline qemu-stable@nongnu.org to commit message
> 
>  translate-all.c |    4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/translate-all.c b/translate-all.c
> index 1f3237e..72bea9b 100644
> --- a/translate-all.c
> +++ b/translate-all.c
> @@ -1308,11 +1308,11 @@ static void tb_link_page(TranslationBlock *tb, tb_page_addr_t phys_pc,
>  /* check whether the given addr is in TCG generated code buffer or not */
>  bool is_tcg_gen_code(uintptr_t tc_ptr)
>  {
> -    /* This can be called during code generation, code_gen_buffer_max_size
> +    /* This can be called during code generation, code_gen_buffer_size
>         is used instead of code_gen_ptr for upper boundary checking */
>      return (tc_ptr >= (uintptr_t)tcg_ctx.code_gen_buffer &&
>              tc_ptr < (uintptr_t)(tcg_ctx.code_gen_buffer +
> -                    tcg_ctx.code_gen_buffer_max_size));
> +                    tcg_ctx.code_gen_buffer_size));
>  }
>  #endif
>  

Thanks, applied.

For the stable branch, please fine the corresponding patch below.

From 931ff5988ecd23e2976d20fc6116d2e42ebf6154 Mon Sep 17 00:00:00 2001
From: Yeongkyoon Lee <yeongkyoon.lee@samsung.com>
Date: Fri, 22 Mar 2013 21:50:17 +0900
Subject: [PATCH] tcg: Fix occasional TCG broken problem when ldst
 optimization enabled

is_tcg_gen_code() checks the upper limit of TCG generated code range wrong, so
that TCG could get broken occasionally only when CONFIG_QEMU_LDST_OPTIMIZATION
enabled. The reason is code_gen_buffer_max_size does not cover the upper range
up to (TCG_MAX_OP_SIZE * OPC_BUF_SIZE), thus code_gen_buffer_max_size should be
modified to code_gen_buffer_size.

CC: qemu-stable@nongnu.org
Signed-off-by: Yeongkyoon Lee <yeongkyoon.lee@samsung.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
(cherry picked from commit 52ae646d4a3ebdcdcc973492c6a56f2c49b6578f)

Conflicts:
	translate-all.c

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 translate-all.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Patch

diff --git a/translate-all.c b/translate-all.c
index d367fc4..bf1db09 100644
--- a/translate-all.c
+++ b/translate-all.c
@@ -1310,10 +1310,10 @@  static void tb_link_page(TranslationBlock *tb, tb_page_addr_t phys_pc,
 /* check whether the given addr is in TCG generated code buffer or not */
 bool is_tcg_gen_code(uintptr_t tc_ptr)
 {
-    /* This can be called during code generation, code_gen_buffer_max_size
+    /* This can be called during code generation, code_gen_buffer_size
        is used instead of code_gen_ptr for upper boundary checking */
     return (tc_ptr >= (uintptr_t)code_gen_buffer &&
-            tc_ptr < (uintptr_t)(code_gen_buffer + code_gen_buffer_max_size));
+            tc_ptr < (uintptr_t)(code_gen_buffer + code_gen_buffer_size));
 }
 #endif