From: pbrook Date: Mon, 31 Mar 2008 17:07:36 +0000 (+0000) Subject: TCG op size estimation fix. X-Git-Tag: TizenStudio_2.0_p2.3~12068 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a208e54a2f97494ccb5f7ba0b852cc1e308ab668;p=sdk%2Femulator%2Fqemu.git TCG op size estimation fix. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4154 c046a42c-6fe2-441c-8c8c-71466251a162 --- diff --git a/exec-all.h b/exec-all.h index 62b8191..898cf68 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 48dabd6..8015202 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 6a273a8..061bb90 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