mirror of https://github.com/xqemu/xqemu.git
(kvm)apic: Add unrealize callbacks
Callbacks will do necessary cleanups before APIC device is deleted Signed-off-by: Chen Fan <chen.fan.fnst@cn.fujitsu.com> Signed-off-by: Gu Zheng <guz.fnst@cn.fujitsu.com> Signed-off-by: Zhu Guihua <zhugh.fnst@cn.fujitsu.com> Signed-off-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
This commit is contained in:
parent
365aa1131f
commit
9c156f9de5
|
@ -192,11 +192,16 @@ static void kvm_apic_realize(DeviceState *dev, Error **errp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void kvm_apic_unrealize(DeviceState *dev, Error **errp)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
static void kvm_apic_class_init(ObjectClass *klass, void *data)
|
static void kvm_apic_class_init(ObjectClass *klass, void *data)
|
||||||
{
|
{
|
||||||
APICCommonClass *k = APIC_COMMON_CLASS(klass);
|
APICCommonClass *k = APIC_COMMON_CLASS(klass);
|
||||||
|
|
||||||
k->realize = kvm_apic_realize;
|
k->realize = kvm_apic_realize;
|
||||||
|
k->unrealize = kvm_apic_unrealize;
|
||||||
k->reset = kvm_apic_reset;
|
k->reset = kvm_apic_reset;
|
||||||
k->set_base = kvm_apic_set_base;
|
k->set_base = kvm_apic_set_base;
|
||||||
k->set_tpr = kvm_apic_set_tpr;
|
k->set_tpr = kvm_apic_set_tpr;
|
||||||
|
|
|
@ -887,11 +887,21 @@ static void apic_realize(DeviceState *dev, Error **errp)
|
||||||
msi_nonbroken = true;
|
msi_nonbroken = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void apic_unrealize(DeviceState *dev, Error **errp)
|
||||||
|
{
|
||||||
|
APICCommonState *s = APIC_COMMON(dev);
|
||||||
|
|
||||||
|
timer_del(s->timer);
|
||||||
|
timer_free(s->timer);
|
||||||
|
local_apics[s->id] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static void apic_class_init(ObjectClass *klass, void *data)
|
static void apic_class_init(ObjectClass *klass, void *data)
|
||||||
{
|
{
|
||||||
APICCommonClass *k = APIC_COMMON_CLASS(klass);
|
APICCommonClass *k = APIC_COMMON_CLASS(klass);
|
||||||
|
|
||||||
k->realize = apic_realize;
|
k->realize = apic_realize;
|
||||||
|
k->unrealize = apic_unrealize;
|
||||||
k->set_base = apic_set_base;
|
k->set_base = apic_set_base;
|
||||||
k->set_tpr = apic_set_tpr;
|
k->set_tpr = apic_set_tpr;
|
||||||
k->get_tpr = apic_get_tpr;
|
k->get_tpr = apic_get_tpr;
|
||||||
|
|
|
@ -315,6 +315,18 @@ static void apic_common_realize(DeviceState *dev, Error **errp)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void apic_common_unrealize(DeviceState *dev, Error **errp)
|
||||||
|
{
|
||||||
|
APICCommonState *s = APIC_COMMON(dev);
|
||||||
|
APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
|
||||||
|
|
||||||
|
info->unrealize(dev, errp);
|
||||||
|
|
||||||
|
if (apic_report_tpr_access && info->enable_tpr_reporting) {
|
||||||
|
info->enable_tpr_reporting(s, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int apic_pre_load(void *opaque)
|
static int apic_pre_load(void *opaque)
|
||||||
{
|
{
|
||||||
APICCommonState *s = APIC_COMMON(opaque);
|
APICCommonState *s = APIC_COMMON(opaque);
|
||||||
|
@ -421,6 +433,7 @@ static void apic_common_class_init(ObjectClass *klass, void *data)
|
||||||
dc->reset = apic_reset_common;
|
dc->reset = apic_reset_common;
|
||||||
dc->props = apic_properties_common;
|
dc->props = apic_properties_common;
|
||||||
dc->realize = apic_common_realize;
|
dc->realize = apic_common_realize;
|
||||||
|
dc->unrealize = apic_common_unrealize;
|
||||||
/*
|
/*
|
||||||
* Reason: APIC and CPU need to be wired up by
|
* Reason: APIC and CPU need to be wired up by
|
||||||
* x86_cpu_apic_create()
|
* x86_cpu_apic_create()
|
||||||
|
|
|
@ -136,6 +136,7 @@ typedef struct APICCommonClass
|
||||||
DeviceClass parent_class;
|
DeviceClass parent_class;
|
||||||
|
|
||||||
DeviceRealize realize;
|
DeviceRealize realize;
|
||||||
|
DeviceUnrealize unrealize;
|
||||||
void (*set_base)(APICCommonState *s, uint64_t val);
|
void (*set_base)(APICCommonState *s, uint64_t val);
|
||||||
void (*set_tpr)(APICCommonState *s, uint8_t val);
|
void (*set_tpr)(APICCommonState *s, uint8_t val);
|
||||||
uint8_t (*get_tpr)(APICCommonState *s);
|
uint8_t (*get_tpr)(APICCommonState *s);
|
||||||
|
|
Loading…
Reference in New Issue