From a208e54a2f97494ccb5f7ba0b852cc1e308ab668 Mon Sep 17 00:00:00 2001 From: pbrook Date: Mon, 31 Mar 2008 17:07:36 +0000 Subject: [PATCH] TCG op size estimation fix. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4154 c046a42c-6fe2-441c-8c8c-71466251a162 --- exec-all.h | 6 ++++++ exec.c | 3 +++ translate-all.c | 1 + 3 files changed, 10 insertions(+) diff --git a/exec-all.h b/exec-all.h index 62b8191913..898cf687c2 100644 --- a/exec-all.h +++ b/exec-all.h @@ -36,6 +36,12 @@ struct TranslationBlock; #define OPC_BUF_SIZE 512 #define OPC_MAX_SIZE (OPC_BUF_SIZE - MAX_OP_PER_INSTR) +/* Maximum size a TCG op can expand to. This is complicated because a + single op may require several host instructions and regirster reloads. + For now take a wild guess at 128 bytes, which should allow at least + a couple of fixup instructions per argument. */ +#define TCG_MAX_OP_SIZE 128 + #define OPPARAM_BUF_SIZE (OPC_BUF_SIZE * MAX_OPC_PARAM) extern target_ulong gen_opc_pc[OPC_BUF_SIZE]; diff --git a/exec.c b/exec.c index 48dabd67ad..8015202a68 100644 --- a/exec.c +++ b/exec.c @@ -367,6 +367,9 @@ void tb_flush(CPUState *env1) nb_tbs, nb_tbs > 0 ? ((unsigned long)(code_gen_ptr - code_gen_buffer)) / nb_tbs : 0); #endif + if ((unsigned long)(code_gen_ptr - code_gen_buffer) > CODE_GEN_BUFFER_SIZE) + cpu_abort(env1, "Internal error: code buffer overflow\n"); + nb_tbs = 0; for(env = first_cpu; env != NULL; env = env->next_cpu) { diff --git a/translate-all.c b/translate-all.c index 6a273a852f..061bb901a3 100644 --- a/translate-all.c +++ b/translate-all.c @@ -71,6 +71,7 @@ unsigned long code_gen_max_block_size(void) static unsigned long max; if (max == 0) { + max = TCG_MAX_OP_SIZE; #define DEF(s, n, copy_size) max = copy_size > max? copy_size : max; #include "tcg-opc.h" #undef DEF -- 2.39.2