qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/2] Add TCG sanity checks (goto_tb related)
@ 2012-09-21  0:18 Max Filippov
  2012-09-21  0:18 ` [Qemu-devel] [PATCH 1/2] tcg/README: document tcg_gen_goto_tb restrictions Max Filippov
  2012-09-21  0:18 ` [Qemu-devel] [PATCH 2/2] tcg: add TB sanity checking Max Filippov
  0 siblings, 2 replies; 6+ messages in thread
From: Max Filippov @ 2012-09-21  0:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: Max Filippov, Peter Maydell, Aurelien Jarno, Richard Henderson

Does this look sane or should it better be merged with e.g. tcg_dump_ops?

Max Filippov (2):
  tcg/README: document tcg_gen_goto_tb restrictions
  tcg: add TB sanity checking

 tcg/README |    3 +-
 tcg/tcg.c  |   69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 71 insertions(+), 1 deletions(-)

-- 
1.7.7.6

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PATCH 1/2] tcg/README: document tcg_gen_goto_tb restrictions
  2012-09-21  0:18 [Qemu-devel] [PATCH 0/2] Add TCG sanity checks (goto_tb related) Max Filippov
@ 2012-09-21  0:18 ` Max Filippov
  2012-09-22 14:55   ` Aurelien Jarno
  2012-09-21  0:18 ` [Qemu-devel] [PATCH 2/2] tcg: add TB sanity checking Max Filippov
  1 sibling, 1 reply; 6+ messages in thread
From: Max Filippov @ 2012-09-21  0:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: Max Filippov, Peter Maydell, Aurelien Jarno, Richard Henderson

See
http://lists.nongnu.org/archive/html/qemu-devel/2012-09/msg03196.html
for the whole story.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
 tcg/README |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/tcg/README b/tcg/README
index cfdfd96..86b43f1 100644
--- a/tcg/README
+++ b/tcg/README
@@ -386,7 +386,8 @@ Exit the current TB and return the value t0 (word type).
 
 Exit the current TB and jump to the TB index 'index' (constant) if the
 current TB was linked to this TB. Otherwise execute the next
-instructions.
+instructions. Only indices 0 and 1 are valid and tcg_gen_goto_tb may be issued
+at most once with each slot index per TB.
 
 * qemu_ld8u t0, t1, flags
 qemu_ld8s t0, t1, flags
-- 
1.7.7.6

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PATCH 2/2] tcg: add TB sanity checking
  2012-09-21  0:18 [Qemu-devel] [PATCH 0/2] Add TCG sanity checks (goto_tb related) Max Filippov
  2012-09-21  0:18 ` [Qemu-devel] [PATCH 1/2] tcg/README: document tcg_gen_goto_tb restrictions Max Filippov
@ 2012-09-21  0:18 ` Max Filippov
  2012-09-21  8:37   ` Michael Tokarev
  2012-09-22 14:55   ` Aurelien Jarno
  1 sibling, 2 replies; 6+ messages in thread
From: Max Filippov @ 2012-09-21  0:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: Max Filippov, Peter Maydell, Aurelien Jarno, Richard Henderson

Do a sanity checking pass on the intermediate code.
Check that goto_tb indices are either 0 or 1 and used at most once per
TB.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
 tcg/tcg.c |   69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 69 insertions(+), 0 deletions(-)

diff --git a/tcg/tcg.c b/tcg/tcg.c
index b8a1bec..cdd1975 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1454,6 +1454,71 @@ static void check_regs(TCGContext *s)
 }
 #endif
 
+#ifdef CONFIG_DEBUG_TCG
+static void tcg_sanity_check(TCGContext *s)
+{
+    const uint16_t *opc_ptr;
+    const TCGArg *args;
+    TCGArg arg;
+    TCGOpcode c;
+    int nb_oargs, nb_iargs, nb_cargs, error_count = 0;
+    const TCGOpDef *def;
+    unsigned goto_tb_slots[2] = {0};
+
+    opc_ptr = gen_opc_buf;
+    args = gen_opparam_buf;
+    while (opc_ptr < gen_opc_ptr) {
+        c = *opc_ptr++;
+        def = &tcg_op_defs[c];
+        if (c == INDEX_op_call) {
+            TCGArg arg;
+
+            /* variable number of arguments */
+            arg = *args++;
+            nb_oargs = arg >> 16;
+            nb_iargs = arg & 0xffff;
+            nb_cargs = def->nb_cargs;
+        } else {
+            if (c == INDEX_op_nopn) {
+                /* variable number of arguments */
+                nb_cargs = *args;
+                nb_oargs = 0;
+                nb_iargs = 0;
+            } else {
+                nb_oargs = def->nb_oargs;
+                nb_iargs = def->nb_iargs;
+                nb_cargs = def->nb_cargs;
+            }
+        }
+
+        switch (c) {
+        case INDEX_op_goto_tb:
+            arg = args[0];
+            if (arg != 0 && arg != 1) {
+                qemu_log("TB ERROR: wrong goto_tb slot index: %"TCG_PRIlx"\n",
+                        arg);
+                ++error_count;
+            } else {
+                ++goto_tb_slots[arg];
+                if (goto_tb_slots[arg] > 1) {
+                    qemu_log("TB ERROR: multiple goto_tb(%"TCG_PRIlx")\n", arg);
+                    ++error_count;
+                }
+            }
+            break;
+
+        default:
+            break;
+        }
+
+        args += nb_iargs + nb_oargs + nb_cargs;
+    }
+    if (error_count) {
+        qemu_log("\n");
+    }
+}
+#endif
+
 static void temp_allocate_frame(TCGContext *s, int temp)
 {
     TCGTemp *ts;
@@ -2082,6 +2147,10 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf,
     }
 #endif
 
+#ifdef CONFIG_DEBUG_TCG
+    tcg_sanity_check(s);
+#endif
+
     tcg_reg_alloc_start(s);
 
     s->code_buf = gen_code_buf;
-- 
1.7.7.6

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2] tcg: add TB sanity checking
  2012-09-21  0:18 ` [Qemu-devel] [PATCH 2/2] tcg: add TB sanity checking Max Filippov
@ 2012-09-21  8:37   ` Michael Tokarev
  2012-09-22 14:55   ` Aurelien Jarno
  1 sibling, 0 replies; 6+ messages in thread
From: Michael Tokarev @ 2012-09-21  8:37 UTC (permalink / raw)
  To: Max Filippov; +Cc: Peter Maydell, qemu-devel, Aurelien Jarno, Richard Henderson

On 21.09.2012 04:18, Max Filippov wrote:

> diff --git a/tcg/tcg.c b/tcg/tcg.c

> +#ifdef CONFIG_DEBUG_TCG
> +static void tcg_sanity_check(TCGContext *s)

#ifndef CONFIG_DEBUG_TCG
#define tcg_sanity_check(s) /*empty*/
#else
static void tcg_sanity_check(TCGContext *s)

> +{
[]
> +}
> +#endif

> @@ -2082,6 +2147,10 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf,
> +#ifdef CONFIG_DEBUG_TCG
> +    tcg_sanity_check(s);
> +#endif

And here we can drop the #ifdef.  FWIW.

/mjt

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] tcg/README: document tcg_gen_goto_tb restrictions
  2012-09-21  0:18 ` [Qemu-devel] [PATCH 1/2] tcg/README: document tcg_gen_goto_tb restrictions Max Filippov
@ 2012-09-22 14:55   ` Aurelien Jarno
  0 siblings, 0 replies; 6+ messages in thread
From: Aurelien Jarno @ 2012-09-22 14:55 UTC (permalink / raw)
  To: Max Filippov; +Cc: Peter Maydell, qemu-devel, Richard Henderson

On Fri, Sep 21, 2012 at 04:18:07AM +0400, Max Filippov wrote:
> See
> http://lists.nongnu.org/archive/html/qemu-devel/2012-09/msg03196.html
> for the whole story.
> 
> Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
> ---
>  tcg/README |    3 ++-
>  1 files changed, 2 insertions(+), 1 deletions(-)
> 
> diff --git a/tcg/README b/tcg/README
> index cfdfd96..86b43f1 100644
> --- a/tcg/README
> +++ b/tcg/README
> @@ -386,7 +386,8 @@ Exit the current TB and return the value t0 (word type).
>  
>  Exit the current TB and jump to the TB index 'index' (constant) if the
>  current TB was linked to this TB. Otherwise execute the next
> -instructions.
> +instructions. Only indices 0 and 1 are valid and tcg_gen_goto_tb may be issued
> +at most once with each slot index per TB.
>  
>  * qemu_ld8u t0, t1, flags
>  qemu_ld8s t0, t1, flags
> -- 
> 1.7.7.6
> 

Thanks, applied.


-- 
Aurelien Jarno                          GPG: 1024D/F1BCDB73
aurelien@aurel32.net                 http://www.aurel32.net

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2] tcg: add TB sanity checking
  2012-09-21  0:18 ` [Qemu-devel] [PATCH 2/2] tcg: add TB sanity checking Max Filippov
  2012-09-21  8:37   ` Michael Tokarev
@ 2012-09-22 14:55   ` Aurelien Jarno
  1 sibling, 0 replies; 6+ messages in thread
From: Aurelien Jarno @ 2012-09-22 14:55 UTC (permalink / raw)
  To: Max Filippov; +Cc: Peter Maydell, qemu-devel, Richard Henderson

On Fri, Sep 21, 2012 at 04:18:08AM +0400, Max Filippov wrote:
> Do a sanity checking pass on the intermediate code.
> Check that goto_tb indices are either 0 or 1 and used at most once per
> TB.
> 
> Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
> ---
>  tcg/tcg.c |   69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 69 insertions(+), 0 deletions(-)
> 
> diff --git a/tcg/tcg.c b/tcg/tcg.c
> index b8a1bec..cdd1975 100644
> --- a/tcg/tcg.c
> +++ b/tcg/tcg.c
> @@ -1454,6 +1454,71 @@ static void check_regs(TCGContext *s)
>  }
>  #endif
>  
> +#ifdef CONFIG_DEBUG_TCG
> +static void tcg_sanity_check(TCGContext *s)
> +{
> +    const uint16_t *opc_ptr;
> +    const TCGArg *args;
> +    TCGArg arg;
> +    TCGOpcode c;
> +    int nb_oargs, nb_iargs, nb_cargs, error_count = 0;
> +    const TCGOpDef *def;
> +    unsigned goto_tb_slots[2] = {0};
> +
> +    opc_ptr = gen_opc_buf;
> +    args = gen_opparam_buf;
> +    while (opc_ptr < gen_opc_ptr) {
> +        c = *opc_ptr++;
> +        def = &tcg_op_defs[c];
> +        if (c == INDEX_op_call) {
> +            TCGArg arg;
> +
> +            /* variable number of arguments */
> +            arg = *args++;
> +            nb_oargs = arg >> 16;
> +            nb_iargs = arg & 0xffff;
> +            nb_cargs = def->nb_cargs;
> +        } else {
> +            if (c == INDEX_op_nopn) {
> +                /* variable number of arguments */
> +                nb_cargs = *args;
> +                nb_oargs = 0;
> +                nb_iargs = 0;
> +            } else {
> +                nb_oargs = def->nb_oargs;
> +                nb_iargs = def->nb_iargs;
> +                nb_cargs = def->nb_cargs;
> +            }
> +        }
> +
> +        switch (c) {
> +        case INDEX_op_goto_tb:
> +            arg = args[0];
> +            if (arg != 0 && arg != 1) {
> +                qemu_log("TB ERROR: wrong goto_tb slot index: %"TCG_PRIlx"\n",
> +                        arg);
> +                ++error_count;
> +            } else {
> +                ++goto_tb_slots[arg];
> +                if (goto_tb_slots[arg] > 1) {
> +                    qemu_log("TB ERROR: multiple goto_tb(%"TCG_PRIlx")\n", arg);
> +                    ++error_count;
> +                }
> +            }
> +            break;
> +
> +        default:
> +            break;
> +        }
> +
> +        args += nb_iargs + nb_oargs + nb_cargs;
> +    }
> +    if (error_count) {
> +        qemu_log("\n");
> +    }
> +}
> +#endif
> +
>  static void temp_allocate_frame(TCGContext *s, int temp)
>  {
>      TCGTemp *ts;
> @@ -2082,6 +2147,10 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf,
>      }
>  #endif
>  
> +#ifdef CONFIG_DEBUG_TCG
> +    tcg_sanity_check(s);
> +#endif
> +
>      tcg_reg_alloc_start(s);
>  
>      s->code_buf = gen_code_buf;

I think this is better address in the patch from Richard Henderson.


-- 
Aurelien Jarno                          GPG: 1024D/F1BCDB73
aurelien@aurel32.net                 http://www.aurel32.net

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-09-22 14:55 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-09-21  0:18 [Qemu-devel] [PATCH 0/2] Add TCG sanity checks (goto_tb related) Max Filippov
2012-09-21  0:18 ` [Qemu-devel] [PATCH 1/2] tcg/README: document tcg_gen_goto_tb restrictions Max Filippov
2012-09-22 14:55   ` Aurelien Jarno
2012-09-21  0:18 ` [Qemu-devel] [PATCH 2/2] tcg: add TB sanity checking Max Filippov
2012-09-21  8:37   ` Michael Tokarev
2012-09-22 14:55   ` Aurelien Jarno

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).