Commit 575a6f40 authored by Paolo Bonzini's avatar Paolo Bonzini
Browse files

kvm/apic: fix 2.2->2.1 migration



The wait_for_sipi field is set back to 1 after an INIT, so it was not
effective to reset it in kvm_apic_realize.  Introduce a reset callback
and reset wait_for_sipi there.

Reported-by: default avatarIgor Mammedov <imammedo@redhat.com>
Cc: qemu-stable@nongnu.org
Reviewed-by: default avatarDr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 2f9ac42a
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -171,12 +171,15 @@ static const MemoryRegionOps kvm_apic_io_ops = {
    .endianness = DEVICE_NATIVE_ENDIAN,
};

static void kvm_apic_realize(DeviceState *dev, Error **errp)
static void kvm_apic_reset(APICCommonState *s)
{
    APICCommonState *s = APIC_COMMON(dev);

    /* Not used by KVM, which uses the CPU mp_state instead.  */
    s->wait_for_sipi = 0;
}

static void kvm_apic_realize(DeviceState *dev, Error **errp)
{
    APICCommonState *s = APIC_COMMON(dev);

    memory_region_init_io(&s->io_memory, NULL, &kvm_apic_io_ops, s, "kvm-apic-msi",
                          APIC_SPACE_SIZE);
@@ -191,6 +194,7 @@ static void kvm_apic_class_init(ObjectClass *klass, void *data)
    APICCommonClass *k = APIC_COMMON_CLASS(klass);

    k->realize = kvm_apic_realize;
    k->reset = kvm_apic_reset;
    k->set_base = kvm_apic_set_base;
    k->set_tpr = kvm_apic_set_tpr;
    k->get_tpr = kvm_apic_get_tpr;
+5 −0
Original line number Diff line number Diff line
@@ -178,6 +178,7 @@ bool apic_next_timer(APICCommonState *s, int64_t current_time)
void apic_init_reset(DeviceState *dev)
{
    APICCommonState *s = APIC_COMMON(dev);
    APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
    int i;

    if (!s) {
@@ -206,6 +207,10 @@ void apic_init_reset(DeviceState *dev)
        timer_del(s->timer);
    }
    s->timer_expiry = -1;

    if (info->reset) {
        info->reset(s);
    }
}

void apic_designate_bsp(DeviceState *dev)
+1 −0
Original line number Diff line number Diff line
@@ -89,6 +89,7 @@ typedef struct APICCommonClass
    void (*external_nmi)(APICCommonState *s);
    void (*pre_save)(APICCommonState *s);
    void (*post_load)(APICCommonState *s);
    void (*reset)(APICCommonState *s);
} APICCommonClass;

struct APICCommonState {