diff options
-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 |