diff options
author | pbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162> | 2008-03-31 17:07:36 +0000 |
---|---|---|
committer | pbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162> | 2008-03-31 17:07:36 +0000 |
commit | a208e54a2f97494ccb5f7ba0b852cc1e308ab668 (patch) | |
tree | c40abd09789d1f23b4714c91780bc48f834bb5ef | |
parent | 663715fbe2f63d651458179952f70769ab38f6f9 (diff) |
TCG op size estimation fix.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4154 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r-- | exec-all.h | 6 | ||||
-rw-r--r-- | exec.c | 3 | ||||
-rw-r--r-- | translate-all.c | 1 |
3 files changed, 10 insertions, 0 deletions
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]; @@ -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 |