accel/tcg: split TCG-only code from cpu_exec_realizefn

move away TCG-only code, make it compile only on TCG.

Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
[claudio: moved the prototypes from hw/core/cpu.h to exec/cpu-all.h]
Signed-off-by: Claudio Fontana <cfontana@suse.de>
Message-Id: <20210204163931.7358-4-cfontana@suse.de>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Claudio Fontana 2021-02-04 17:39:11 +01:00 committed by Richard Henderson
parent 6a3d2e7c06
commit 7df5e3d6ad
5 changed files with 77 additions and 40 deletions

View File

@ -828,6 +828,34 @@ int cpu_exec(CPUState *cpu)
return ret; return ret;
} }
void tcg_exec_realizefn(CPUState *cpu, Error **errp)
{
static bool tcg_target_initialized;
CPUClass *cc = CPU_GET_CLASS(cpu);
if (!tcg_target_initialized) {
cc->tcg_ops.initialize();
tcg_target_initialized = true;
}
tlb_init(cpu);
qemu_plugin_vcpu_init_hook(cpu);
#ifndef CONFIG_USER_ONLY
tcg_iommu_init_notifier_list(cpu);
#endif /* !CONFIG_USER_ONLY */
}
/* undo the initializations in reverse order */
void tcg_exec_unrealizefn(CPUState *cpu)
{
#ifndef CONFIG_USER_ONLY
tcg_iommu_free_notifier_list(cpu);
#endif /* !CONFIG_USER_ONLY */
qemu_plugin_vcpu_exit_hook(cpu);
tlb_destroy(cpu);
}
#ifndef CONFIG_USER_ONLY #ifndef CONFIG_USER_ONLY
void dump_drift_info(void) void dump_drift_info(void)

70
cpu.c
View File

@ -124,12 +124,34 @@ const VMStateDescription vmstate_cpu_common = {
}; };
#endif #endif
void cpu_exec_unrealizefn(CPUState *cpu) void cpu_exec_realizefn(CPUState *cpu, Error **errp)
{ {
CPUClass *cc = CPU_GET_CLASS(cpu); CPUClass *cc = CPU_GET_CLASS(cpu);
tlb_destroy(cpu); cpu_list_add(cpu);
cpu_list_remove(cpu);
#ifdef CONFIG_TCG
/* NB: errp parameter is unused currently */
if (tcg_enabled()) {
tcg_exec_realizefn(cpu, errp);
}
#endif /* CONFIG_TCG */
#ifdef CONFIG_USER_ONLY
assert(cc->vmsd == NULL);
#else
if (qdev_get_vmsd(DEVICE(cpu)) == NULL) {
vmstate_register(NULL, cpu->cpu_index, &vmstate_cpu_common, cpu);
}
if (cc->vmsd != NULL) {
vmstate_register(NULL, cpu->cpu_index, cc->vmsd, cpu);
}
#endif /* CONFIG_USER_ONLY */
}
void cpu_exec_unrealizefn(CPUState *cpu)
{
CPUClass *cc = CPU_GET_CLASS(cpu);
#ifdef CONFIG_USER_ONLY #ifdef CONFIG_USER_ONLY
assert(cc->vmsd == NULL); assert(cc->vmsd == NULL);
@ -140,8 +162,15 @@ void cpu_exec_unrealizefn(CPUState *cpu)
if (qdev_get_vmsd(DEVICE(cpu)) == NULL) { if (qdev_get_vmsd(DEVICE(cpu)) == NULL) {
vmstate_unregister(NULL, &vmstate_cpu_common, cpu); vmstate_unregister(NULL, &vmstate_cpu_common, cpu);
} }
tcg_iommu_free_notifier_list(cpu);
#endif #endif
#ifdef CONFIG_TCG
/* NB: errp parameter is unused currently */
if (tcg_enabled()) {
tcg_exec_unrealizefn(cpu);
}
#endif /* CONFIG_TCG */
cpu_list_remove(cpu);
} }
void cpu_exec_initfn(CPUState *cpu) void cpu_exec_initfn(CPUState *cpu)
@ -156,39 +185,6 @@ void cpu_exec_initfn(CPUState *cpu)
#endif #endif
} }
void cpu_exec_realizefn(CPUState *cpu, Error **errp)
{
CPUClass *cc = CPU_GET_CLASS(cpu);
#ifdef CONFIG_TCG
static bool tcg_target_initialized;
#endif /* CONFIG_TCG */
cpu_list_add(cpu);
#ifdef CONFIG_TCG
if (tcg_enabled() && !tcg_target_initialized) {
tcg_target_initialized = true;
cc->tcg_ops.initialize();
}
#endif /* CONFIG_TCG */
tlb_init(cpu);
qemu_plugin_vcpu_init_hook(cpu);
#ifdef CONFIG_USER_ONLY
assert(cc->vmsd == NULL);
#else /* !CONFIG_USER_ONLY */
if (qdev_get_vmsd(DEVICE(cpu)) == NULL) {
vmstate_register(NULL, cpu->cpu_index, &vmstate_cpu_common, cpu);
}
if (cc->vmsd != NULL) {
vmstate_register(NULL, cpu->cpu_index, cc->vmsd, cpu);
}
tcg_iommu_init_notifier_list(cpu);
#endif
}
const char *parse_cpu_option(const char *cpu_option) const char *parse_cpu_option(const char *cpu_option)
{ {
ObjectClass *oc; ObjectClass *oc;

View File

@ -199,6 +199,10 @@ static bool cpu_common_virtio_is_big_endian(CPUState *cpu)
return target_words_bigendian(); return target_words_bigendian();
} }
/*
* XXX the following #if is always true because this is a common_ss
* module, so target CONFIG_* is never defined.
*/
#if !defined(CONFIG_USER_ONLY) #if !defined(CONFIG_USER_ONLY)
GuestPanicInformation *cpu_get_crash_info(CPUState *cpu) GuestPanicInformation *cpu_get_crash_info(CPUState *cpu)
{ {
@ -340,9 +344,9 @@ static void cpu_common_realizefn(DeviceState *dev, Error **errp)
static void cpu_common_unrealizefn(DeviceState *dev) static void cpu_common_unrealizefn(DeviceState *dev)
{ {
CPUState *cpu = CPU(dev); CPUState *cpu = CPU(dev);
/* NOTE: latest generic point before the cpu is fully unrealized */ /* NOTE: latest generic point before the cpu is fully unrealized */
trace_fini_vcpu(cpu); trace_fini_vcpu(cpu);
qemu_plugin_vcpu_exit_hook(cpu);
cpu_exec_unrealizefn(cpu); cpu_exec_unrealizefn(cpu);
} }

View File

@ -410,19 +410,26 @@ static inline bool tlb_hit(target_ulong tlb_addr, target_ulong addr)
} }
#ifdef CONFIG_TCG #ifdef CONFIG_TCG
/* accel/tcg/cpu-exec.c */
void dump_drift_info(void); void dump_drift_info(void);
/* accel/tcg/translate-all.c */
void dump_exec_info(void); void dump_exec_info(void);
void dump_opcount_info(void); void dump_opcount_info(void);
#endif /* CONFIG_TCG */ #endif /* CONFIG_TCG */
#endif /* !CONFIG_USER_ONLY */ #endif /* !CONFIG_USER_ONLY */
#ifdef CONFIG_TCG
/* accel/tcg/cpu-exec.c */
int cpu_exec(CPUState *cpu);
void tcg_exec_realizefn(CPUState *cpu, Error **errp);
void tcg_exec_unrealizefn(CPUState *cpu);
#endif /* CONFIG_TCG */
/* Returns: 0 on success, -1 on error */ /* Returns: 0 on success, -1 on error */
int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr, int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr,
void *ptr, target_ulong len, bool is_write); void *ptr, target_ulong len, bool is_write);
int cpu_exec(CPUState *cpu);
/** /**
* cpu_set_cpustate_pointers(cpu) * cpu_set_cpustate_pointers(cpu)
* @cpu: The cpu object * @cpu: The cpu object

View File

@ -1126,6 +1126,8 @@ AddressSpace *cpu_get_address_space(CPUState *cpu, int asidx);
void QEMU_NORETURN cpu_abort(CPUState *cpu, const char *fmt, ...) void QEMU_NORETURN cpu_abort(CPUState *cpu, const char *fmt, ...)
GCC_FMT_ATTR(2, 3); GCC_FMT_ATTR(2, 3);
/* $(top_srcdir)/cpu.c */
void cpu_exec_initfn(CPUState *cpu); void cpu_exec_initfn(CPUState *cpu);
void cpu_exec_realizefn(CPUState *cpu, Error **errp); void cpu_exec_realizefn(CPUState *cpu, Error **errp);
void cpu_exec_unrealizefn(CPUState *cpu); void cpu_exec_unrealizefn(CPUState *cpu);