Move target cpu tcg initialization to common code,
called from cpu_exec_realizefn.
Cc: Andreas Färber
Signed-off-by: Richard Henderson
---
include/qom/cpu.h | 8 ++--
target/sparc/cpu.h | 2 +-
exec.c | 7 ++-
target/alpha/cpu.c | 5 +
target/alpha/translate.c| 6 --
target/arm/cpu.c| 6 +-
target/cris/cpu.c | 16 ++--
target/hppa/cpu.c | 3 +--
target/hppa/translate.c | 6 --
target/i386/cpu.c | 5 +
target/i386/translate.c | 6 --
target/lm32/cpu.c | 7 +--
target/m68k/cpu.c | 7 +--
target/microblaze/cpu.c | 7 +--
target/mips/cpu.c | 5 +
target/mips/translate.c | 7 ---
target/moxie/cpu.c | 7 +--
target/moxie/translate.c| 6 --
target/nios2/cpu.c | 7 +--
target/openrisc/cpu.c | 7 +--
target/ppc/translate.c | 6 --
target/ppc/translate_init.c | 5 +
target/s390x/cpu.c | 7 +--
target/sh4/cpu.c| 5 +
target/sh4/translate.c | 7 ---
target/sparc/cpu.c | 5 +
target/sparc/translate.c| 9 +
target/tilegx/cpu.c | 7 +--
target/tricore/cpu.c| 5 +
target/tricore/translate.c | 5 +
target/unicore32/cpu.c | 7 +--
target/xtensa/cpu.c | 7 +--
32 files changed, 40 insertions(+), 165 deletions(-)
diff --git a/include/qom/cpu.h b/include/qom/cpu.h
index 0efebdbcf4..df0ba86202 100644
--- a/include/qom/cpu.h
+++ b/include/qom/cpu.h
@@ -195,10 +195,8 @@ typedef struct CPUClass {
void *opaque);
const struct VMStateDescription *vmsd;
-int gdb_num_core_regs;
const char *gdb_core_xml_file;
gchar * (*gdb_arch_name)(CPUState *cpu);
-bool gdb_stop_before_watchpoint;
void (*cpu_exec_enter)(CPUState *cpu);
void (*cpu_exec_exit)(CPUState *cpu);
@@ -206,6 +204,12 @@ typedef struct CPUClass {
void (*disas_set_info)(CPUState *cpu, disassemble_info *info);
vaddr (*adjust_watchpoint_address)(CPUState *cpu, vaddr addr, int len);
+void (*tcg_initialize)(void);
+
+/* Keep non-pointer data at the end to minimize holes. */
+int gdb_num_core_regs;
+bool gdb_stop_before_watchpoint;
+bool tcg_initialized;
} CPUClass;
#ifdef HOST_WORDS_BIGENDIAN
diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h
index 1598f65927..bf2b8931cc 100644
--- a/target/sparc/cpu.h
+++ b/target/sparc/cpu.h
@@ -594,7 +594,7 @@ int sparc_cpu_memory_rw_debug(CPUState *cpu, vaddr addr,
/* translate.c */
-void gen_intermediate_code_init(CPUSPARCState *env);
+void sparc_tcg_init(void);
/* cpu-exec.c */
diff --git a/exec.c b/exec.c
index 6378714a2b..30a1a9fb79 100644
--- a/exec.c
+++ b/exec.c
@@ -763,10 +763,15 @@ void cpu_exec_initfn(CPUState *cpu)
void cpu_exec_realizefn(CPUState *cpu, Error **errp)
{
-CPUClass *cc ATTRIBUTE_UNUSED = CPU_GET_CLASS(cpu);
+CPUClass *cc = CPU_GET_CLASS(cpu);
cpu_list_add(cpu);
+if (tcg_enabled() && !cc->tcg_initialized) {
+cc->tcg_initialized = true;
+cc->tcg_initialize();
+}
+
#ifndef CONFIG_USER_ONLY
if (qdev_get_vmsd(DEVICE(cpu)) == NULL) {
vmstate_register(NULL, cpu->cpu_index, &vmstate_cpu_common, cpu);
diff --git a/target/alpha/cpu.c b/target/alpha/cpu.c
index b52ebd7356..bc9520535b 100644
--- a/target/alpha/cpu.c
+++ b/target/alpha/cpu.c
@@ -260,10 +260,6 @@ static void alpha_cpu_initfn(Object *obj)
cs->env_ptr = env;
tlb_flush(cs);
-if (tcg_enabled()) {
-alpha_translate_init();
-}
-
env->lock_addr = -1;
#if defined(CONFIG_USER_ONLY)
env->flags = ENV_FLAG_PS_USER | ENV_FLAG_FEN;
@@ -301,6 +297,7 @@ static void alpha_cpu_class_init(ObjectClass *oc, void
*data)
dc->vmsd = &vmstate_alpha_cpu;
#endif
cc->disas_set_info = alpha_cpu_disas_set_info;
+cc->tcg_initialize = alpha_translate_init;
cc->gdb_num_core_regs = 67;
}
diff --git a/target/alpha/translate.c b/target/alpha/translate.c
index f32c95b9a1..3c8d1dc333 100644
--- a/target/alpha/translate.c
+++ b/target/alpha/translate.c
@@ -124,14 +124,8 @@ void alpha_translate_init(void)
};
#endif
-static bool done_init = 0;
int i;
-if (done_init) {
-return;
-}
-done_init = 1;
-
cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env");
tcg_ctx.tcg_env = cpu_env;
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index 88578f360e..056284985d 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -534,7 +534,6 @@ static void arm_cpu_initfn(Object *obj)
{
CPUState *cs = CPU(obj);
ARMCPU *cpu = ARM_CPU(obj);
-static bool inited;
cs->env_ptr = &cpu->env;
cpu->cp_regs = g_hash_table_new_full(g_int_hash, g_int_equal,
@@ -578,10 +577,6 @@ static void arm_cpu_initfn(Object *obj)
if (