Commit 55c3ceef authored by Richard Henderson's avatar Richard Henderson
Browse files

qom: Introduce CPUClass.tcg_initialize



Move target cpu tcg initialization to common code,
called from cpu_exec_realizefn.

Acked-by: default avatarAndreas Färber <afaerber@suse.de>
Reviewed-by: default avatarEmilio G. Cota <cota@braap.org>
Reviewed-by: default avatarPhilippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: default avatarRichard Henderson <richard.henderson@linaro.org>
parent 11f4e8f8
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -791,10 +791,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);
+6 −2
Original line number Diff line number Diff line
@@ -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
+1 −2
Original line number Diff line number Diff line
@@ -260,8 +260,6 @@ static void alpha_cpu_initfn(Object *obj)
    cs->env_ptr = env;
    tlb_flush(cs);

    alpha_translate_init();

    env->lock_addr = -1;
#if defined(CONFIG_USER_ONLY)
    env->flags = ENV_FLAG_PS_USER | ENV_FLAG_FEN;
@@ -299,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;
}
+0 −6
Original line number Diff line number Diff line
@@ -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;

+1 −5
Original line number Diff line number Diff line
@@ -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 (tcg_enabled()) {
        cpu->psci_version = 2; /* TCG implements PSCI 0.2 */
        if (!inited) {
            inited = true;
            arm_translate_init();
        }
    }
}

@@ -1765,6 +1760,7 @@ static void arm_cpu_class_init(ObjectClass *oc, void *data)
#endif

    cc->disas_set_info = arm_disas_set_info;
    cc->tcg_initialize = arm_translate_init;
}

static void cpu_register(const ARMCPUInfo *info)
Loading