move apic vmstate register into x86_cpu_apic_realize, and use cc->get_arch_id as the instance id to avoid using the auto-id which will break the migration if we add device not in order.
Signed-off-by: Gu Zheng <guz.f...@cn.fujitsu.com> Signed-off-by: Zhu Guihua <zhugh.f...@cn.fujitsu.com> --- hw/intc/apic_common.c | 3 +-- include/hw/i386/apic_internal.h | 3 +++ target-i386/cpu.c | 8 +++++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c index 4e62f25..62843dc 100644 --- a/hw/intc/apic_common.c +++ b/hw/intc/apic_common.c @@ -375,7 +375,7 @@ static const VMStateDescription vmstate_apic_common_sipi = { } }; -static const VMStateDescription vmstate_apic_common = { +const VMStateDescription vmstate_apic_common = { .name = "apic", .version_id = 3, .minimum_version_id = 3, @@ -429,7 +429,6 @@ static void apic_common_class_init(ObjectClass *klass, void *data) ICCDeviceClass *idc = ICC_DEVICE_CLASS(klass); DeviceClass *dc = DEVICE_CLASS(klass); - dc->vmsd = &vmstate_apic_common; dc->reset = apic_reset_common; dc->props = apic_properties_common; idc->realize = apic_common_realize; diff --git a/include/hw/i386/apic_internal.h b/include/hw/i386/apic_internal.h index 83e2a42..61fddf6 100644 --- a/include/hw/i386/apic_internal.h +++ b/include/hw/i386/apic_internal.h @@ -23,6 +23,7 @@ #include "exec/memory.h" #include "hw/cpu/icc_bus.h" #include "qemu/timer.h" +#include "migration/vmstate.h" /* APIC Local Vector Table */ #define APIC_LVT_TIMER 0 @@ -137,6 +138,8 @@ typedef struct VAPICState { extern bool apic_report_tpr_access; +extern const VMStateDescription vmstate_apic_common; + void apic_report_irq_delivered(int delivered); bool apic_next_timer(APICCommonState *s, int64_t current_time); void apic_enable_tpr_access_reporting(DeviceState *d, bool enable); diff --git a/target-i386/cpu.c b/target-i386/cpu.c index e9df33e..4b4a595 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -2692,10 +2692,16 @@ static void x86_cpu_apic_create(X86CPU *cpu, Error **errp) static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp) { - if (cpu->apic_state == NULL) { + DeviceState *apic_state = cpu->apic_state; + CPUClass *cc = CPU_GET_CLASS(CPU(cpu)); + + if (apic_state == NULL) { return; } + vmstate_register(0, cc->get_arch_id(CPU(cpu)), + &vmstate_apic_common, apic_state); + if (qdev_init(cpu->apic_state)) { error_setg(errp, "APIC device '%s' could not be initialized", object_get_typename(OBJECT(cpu->apic_state))); -- 1.7.7