From: Gu Zheng <guz.f...@cn.fujitsu.com> Move cpu vmstate register from cpu_exec_init into cpu_common_realizefn, and use cc->get_arch_id as the instance id that suggested by Igor to fix the migration issue.
Signed-off-by: Gu Zheng <guz.f...@cn.fujitsu.com> Signed-off-by: Zhu Guihua <zhugh.f...@cn.fujitsu.com> --- exec.c | 25 ++++++++++++++++++------- include/qom/cpu.h | 2 ++ qom/cpu.c | 4 ++++ 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/exec.c b/exec.c index 6dff7bc..8361591 100644 --- a/exec.c +++ b/exec.c @@ -513,10 +513,26 @@ void tcg_cpu_address_space_init(CPUState *cpu, AddressSpace *as) } #endif +void cpu_vmstate_register(CPUState *cpu) +{ + CPUClass *cc = CPU_GET_CLASS(cpu); + int cpu_index = cc->get_arch_id(cpu) + max_cpus; + int compat_index = cc->get_compat_arch_id(cpu); + + if (qdev_get_vmsd(DEVICE(cpu)) == NULL) { + vmstate_register_with_alias_id(NULL, cpu_index, &vmstate_cpu_common, + cpu, compat_index, 3); + } + + if (cc->vmsd != NULL) { + vmstate_register_with_alias_id(NULL, cpu_index, cc->vmsd, + cpu, compat_index, 3); + } +} + void cpu_exec_init(CPUArchState *env) { CPUState *cpu = ENV_GET_CPU(env); - CPUClass *cc = CPU_GET_CLASS(cpu); CPUState *some_cpu; int cpu_index; @@ -539,18 +555,13 @@ void cpu_exec_init(CPUArchState *env) #if defined(CONFIG_USER_ONLY) cpu_list_unlock(); #endif - if (qdev_get_vmsd(DEVICE(cpu)) == NULL) { - vmstate_register(NULL, cpu_index, &vmstate_cpu_common, cpu); - } #if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY) + CPUClass *cc = CPU_GET_CLASS(cpu); register_savevm(NULL, "cpu", cpu_index, CPU_SAVE_VERSION, cpu_save, cpu_load, env); assert(cc->vmsd == NULL); assert(qdev_get_vmsd(DEVICE(cpu)) == NULL); #endif - if (cc->vmsd != NULL) { - vmstate_register(NULL, cpu_index, cc->vmsd, cpu); - } } #if defined(CONFIG_USER_ONLY) diff --git a/include/qom/cpu.h b/include/qom/cpu.h index 2e68dd2..d0a50e2 100644 --- a/include/qom/cpu.h +++ b/include/qom/cpu.h @@ -565,6 +565,8 @@ void cpu_interrupt(CPUState *cpu, int mask); #endif /* USER_ONLY */ +void cpu_vmstate_register(CPUState *cpu); + #ifdef CONFIG_SOFTMMU static inline void cpu_unassigned_access(CPUState *cpu, hwaddr addr, bool is_write, bool is_exec, diff --git a/qom/cpu.c b/qom/cpu.c index 83d7766..8e37045 100644 --- a/qom/cpu.c +++ b/qom/cpu.c @@ -302,6 +302,10 @@ static void cpu_common_realizefn(DeviceState *dev, Error **errp) { CPUState *cpu = CPU(dev); +#if !defined(CONFIG_USER_ONLY) + cpu_vmstate_register(cpu); +#endif + if (dev->hotplugged) { cpu_synchronize_post_init(cpu); cpu_resume(cpu); -- 1.9.3