summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162>2008-03-31 17:07:36 +0000
committerpbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162>2008-03-31 17:07:36 +0000
commita208e54a2f97494ccb5f7ba0b852cc1e308ab668 (patch)
treec40abd09789d1f23b4714c91780bc48f834bb5ef
parent663715fbe2f63d651458179952f70769ab38f6f9 (diff)
downloadhqemu-a208e54a2f97494ccb5f7ba0b852cc1e308ab668.zip
hqemu-a208e54a2f97494ccb5f7ba0b852cc1e308ab668.tar.gz
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.h6
-rw-r--r--exec.c3
-rw-r--r--translate-all.c1
3 files changed, 10 insertions, 0 deletions
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
OpenPOWER on IntegriCloud