All of lore.kernel.org
 help / color / mirror / Atom feed
From: Max Filippov <jcmvbkbc@gmail.com>
To: qemu-devel@nongnu.org
Cc: Max Filippov <jcmvbkbc@gmail.com>,
	Peter Maydell <peter.maydell@linaro.org>,
	Aurelien Jarno <aurelien@aurel32.net>,
	Richard Henderson <rth@twiddle.net>
Subject: [Qemu-devel] [PATCH 2/2] tcg: add TB sanity checking
Date: Fri, 21 Sep 2012 04:18:08 +0400	[thread overview]
Message-ID: <1348186688-29410-3-git-send-email-jcmvbkbc@gmail.com> (raw)
In-Reply-To: <1348186688-29410-1-git-send-email-jcmvbkbc@gmail.com>

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

  parent reply	other threads:[~2012-09-21  0:18 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 ` Max Filippov [this message]
2012-09-21  8:37   ` [Qemu-devel] [PATCH 2/2] tcg: add TB sanity checking Michael Tokarev
2012-09-22 14:55   ` Aurelien Jarno

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1348186688-29410-3-git-send-email-jcmvbkbc@gmail.com \
    --to=jcmvbkbc@gmail.com \
    --cc=aurelien@aurel32.net \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.