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:
parent
6a3d2e7c06
commit
7df5e3d6ad
@ -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
70
cpu.c
@ -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;
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user