mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-11 03:24:58 -06:00
hw/ipmi: Don't call vmstate_register() from instance_init() functions
instance_init() can be called multiple times, e.g. during introspection of the device. We should not install the vmstate handlers here. Do it in the realize() function instead. Signed-off-by: Thomas Huth <thuth@redhat.com> Reviewed-by: Juan Quintela <quintela@redhat.com> Acked-by: Corey Minyard <cminyard@mvista.com> Signed-off-by: Juan Quintela <quintela@redhat.com> Message-ID: <20231020145554.662751-1-thuth@redhat.com>
This commit is contained in:
parent
6c9ae1ce82
commit
6436db5a60
3 changed files with 57 additions and 56 deletions
|
@ -453,19 +453,6 @@ static void ipmi_bmc_extern_handle_reset(IPMIBmc *b)
|
||||||
continue_send(ibe);
|
continue_send(ibe);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ipmi_bmc_extern_realize(DeviceState *dev, Error **errp)
|
|
||||||
{
|
|
||||||
IPMIBmcExtern *ibe = IPMI_BMC_EXTERN(dev);
|
|
||||||
|
|
||||||
if (!qemu_chr_fe_backend_connected(&ibe->chr)) {
|
|
||||||
error_setg(errp, "IPMI external bmc requires chardev attribute");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
qemu_chr_fe_set_handlers(&ibe->chr, can_receive, receive,
|
|
||||||
chr_event, NULL, ibe, NULL, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ipmi_bmc_extern_post_migrate(void *opaque, int version_id)
|
static int ipmi_bmc_extern_post_migrate(void *opaque, int version_id)
|
||||||
{
|
{
|
||||||
IPMIBmcExtern *ibe = opaque;
|
IPMIBmcExtern *ibe = opaque;
|
||||||
|
@ -499,12 +486,26 @@ static const VMStateDescription vmstate_ipmi_bmc_extern = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void ipmi_bmc_extern_realize(DeviceState *dev, Error **errp)
|
||||||
|
{
|
||||||
|
IPMIBmcExtern *ibe = IPMI_BMC_EXTERN(dev);
|
||||||
|
|
||||||
|
if (!qemu_chr_fe_backend_connected(&ibe->chr)) {
|
||||||
|
error_setg(errp, "IPMI external bmc requires chardev attribute");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
qemu_chr_fe_set_handlers(&ibe->chr, can_receive, receive,
|
||||||
|
chr_event, NULL, ibe, NULL, true);
|
||||||
|
|
||||||
|
vmstate_register(NULL, 0, &vmstate_ipmi_bmc_extern, ibe);
|
||||||
|
}
|
||||||
|
|
||||||
static void ipmi_bmc_extern_init(Object *obj)
|
static void ipmi_bmc_extern_init(Object *obj)
|
||||||
{
|
{
|
||||||
IPMIBmcExtern *ibe = IPMI_BMC_EXTERN(obj);
|
IPMIBmcExtern *ibe = IPMI_BMC_EXTERN(obj);
|
||||||
|
|
||||||
ibe->extern_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, extern_timeout, ibe);
|
ibe->extern_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, extern_timeout, ibe);
|
||||||
vmstate_register(NULL, 0, &vmstate_ipmi_bmc_extern, ibe);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ipmi_bmc_extern_finalize(Object *obj)
|
static void ipmi_bmc_extern_finalize(Object *obj)
|
||||||
|
|
|
@ -68,6 +68,21 @@ static void isa_ipmi_bt_lower_irq(IPMIBT *ib)
|
||||||
qemu_irq_lower(iib->irq);
|
qemu_irq_lower(iib->irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const VMStateDescription vmstate_ISAIPMIBTDevice = {
|
||||||
|
.name = TYPE_IPMI_INTERFACE_PREFIX "isa-bt",
|
||||||
|
.version_id = 2,
|
||||||
|
.minimum_version_id = 2,
|
||||||
|
/*
|
||||||
|
* Version 1 had messed up the array transfer, it's not even usable
|
||||||
|
* because it used VMSTATE_VBUFFER_UINT32, but it did not transfer
|
||||||
|
* the buffer length, so random things would happen.
|
||||||
|
*/
|
||||||
|
.fields = (VMStateField[]) {
|
||||||
|
VMSTATE_STRUCT(bt, ISAIPMIBTDevice, 1, vmstate_IPMIBT, IPMIBT),
|
||||||
|
VMSTATE_END_OF_LIST()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
static void isa_ipmi_bt_realize(DeviceState *dev, Error **errp)
|
static void isa_ipmi_bt_realize(DeviceState *dev, Error **errp)
|
||||||
{
|
{
|
||||||
Error *err = NULL;
|
Error *err = NULL;
|
||||||
|
@ -102,30 +117,15 @@ static void isa_ipmi_bt_realize(DeviceState *dev, Error **errp)
|
||||||
qdev_set_legacy_instance_id(dev, iib->bt.io_base, iib->bt.io_length);
|
qdev_set_legacy_instance_id(dev, iib->bt.io_base, iib->bt.io_length);
|
||||||
|
|
||||||
isa_register_ioport(isadev, &iib->bt.io, iib->bt.io_base);
|
isa_register_ioport(isadev, &iib->bt.io, iib->bt.io_base);
|
||||||
}
|
|
||||||
|
|
||||||
static const VMStateDescription vmstate_ISAIPMIBTDevice = {
|
vmstate_register(NULL, 0, &vmstate_ISAIPMIBTDevice, dev);
|
||||||
.name = TYPE_IPMI_INTERFACE_PREFIX "isa-bt",
|
|
||||||
.version_id = 2,
|
|
||||||
.minimum_version_id = 2,
|
|
||||||
/*
|
|
||||||
* Version 1 had messed up the array transfer, it's not even usable
|
|
||||||
* because it used VMSTATE_VBUFFER_UINT32, but it did not transfer
|
|
||||||
* the buffer length, so random things would happen.
|
|
||||||
*/
|
|
||||||
.fields = (VMStateField[]) {
|
|
||||||
VMSTATE_STRUCT(bt, ISAIPMIBTDevice, 1, vmstate_IPMIBT, IPMIBT),
|
|
||||||
VMSTATE_END_OF_LIST()
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
static void isa_ipmi_bt_init(Object *obj)
|
static void isa_ipmi_bt_init(Object *obj)
|
||||||
{
|
{
|
||||||
ISAIPMIBTDevice *iib = ISA_IPMI_BT(obj);
|
ISAIPMIBTDevice *iib = ISA_IPMI_BT(obj);
|
||||||
|
|
||||||
ipmi_bmc_find_and_link(obj, (Object **) &iib->bt.bmc);
|
ipmi_bmc_find_and_link(obj, (Object **) &iib->bt.bmc);
|
||||||
|
|
||||||
vmstate_register(NULL, 0, &vmstate_ISAIPMIBTDevice, iib);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *isa_ipmi_bt_get_backend_data(IPMIInterface *ii)
|
static void *isa_ipmi_bt_get_backend_data(IPMIInterface *ii)
|
||||||
|
|
|
@ -67,6 +67,24 @@ static void isa_ipmi_kcs_lower_irq(IPMIKCS *ik)
|
||||||
qemu_irq_lower(iik->irq);
|
qemu_irq_lower(iik->irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool vmstate_kcs_before_version2(void *opaque, int version)
|
||||||
|
{
|
||||||
|
return version <= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const VMStateDescription vmstate_ISAIPMIKCSDevice = {
|
||||||
|
.name = TYPE_IPMI_INTERFACE,
|
||||||
|
.version_id = 2,
|
||||||
|
.minimum_version_id = 1,
|
||||||
|
.fields = (VMStateField[]) {
|
||||||
|
VMSTATE_VSTRUCT_TEST(kcs, ISAIPMIKCSDevice, vmstate_kcs_before_version2,
|
||||||
|
0, vmstate_IPMIKCS, IPMIKCS, 1),
|
||||||
|
VMSTATE_VSTRUCT_V(kcs, ISAIPMIKCSDevice, 2, vmstate_IPMIKCS,
|
||||||
|
IPMIKCS, 2),
|
||||||
|
VMSTATE_END_OF_LIST()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
static void ipmi_isa_realize(DeviceState *dev, Error **errp)
|
static void ipmi_isa_realize(DeviceState *dev, Error **errp)
|
||||||
{
|
{
|
||||||
Error *err = NULL;
|
Error *err = NULL;
|
||||||
|
@ -101,31 +119,6 @@ static void ipmi_isa_realize(DeviceState *dev, Error **errp)
|
||||||
qdev_set_legacy_instance_id(dev, iik->kcs.io_base, iik->kcs.io_length);
|
qdev_set_legacy_instance_id(dev, iik->kcs.io_base, iik->kcs.io_length);
|
||||||
|
|
||||||
isa_register_ioport(isadev, &iik->kcs.io, iik->kcs.io_base);
|
isa_register_ioport(isadev, &iik->kcs.io, iik->kcs.io_base);
|
||||||
}
|
|
||||||
|
|
||||||
static bool vmstate_kcs_before_version2(void *opaque, int version)
|
|
||||||
{
|
|
||||||
return version <= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const VMStateDescription vmstate_ISAIPMIKCSDevice = {
|
|
||||||
.name = TYPE_IPMI_INTERFACE,
|
|
||||||
.version_id = 2,
|
|
||||||
.minimum_version_id = 1,
|
|
||||||
.fields = (VMStateField[]) {
|
|
||||||
VMSTATE_VSTRUCT_TEST(kcs, ISAIPMIKCSDevice, vmstate_kcs_before_version2,
|
|
||||||
0, vmstate_IPMIKCS, IPMIKCS, 1),
|
|
||||||
VMSTATE_VSTRUCT_V(kcs, ISAIPMIKCSDevice, 2, vmstate_IPMIKCS,
|
|
||||||
IPMIKCS, 2),
|
|
||||||
VMSTATE_END_OF_LIST()
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static void isa_ipmi_kcs_init(Object *obj)
|
|
||||||
{
|
|
||||||
ISAIPMIKCSDevice *iik = ISA_IPMI_KCS(obj);
|
|
||||||
|
|
||||||
ipmi_bmc_find_and_link(obj, (Object **) &iik->kcs.bmc);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Version 1 had an incorrect name, it clashed with the BT
|
* Version 1 had an incorrect name, it clashed with the BT
|
||||||
|
@ -135,6 +128,13 @@ static void isa_ipmi_kcs_init(Object *obj)
|
||||||
vmstate_register(NULL, 0, &vmstate_ISAIPMIKCSDevice, iik);
|
vmstate_register(NULL, 0, &vmstate_ISAIPMIKCSDevice, iik);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void isa_ipmi_kcs_init(Object *obj)
|
||||||
|
{
|
||||||
|
ISAIPMIKCSDevice *iik = ISA_IPMI_KCS(obj);
|
||||||
|
|
||||||
|
ipmi_bmc_find_and_link(obj, (Object **) &iik->kcs.bmc);
|
||||||
|
}
|
||||||
|
|
||||||
static void *isa_ipmi_kcs_get_backend_data(IPMIInterface *ii)
|
static void *isa_ipmi_kcs_get_backend_data(IPMIInterface *ii)
|
||||||
{
|
{
|
||||||
ISAIPMIKCSDevice *iik = ISA_IPMI_KCS(ii);
|
ISAIPMIKCSDevice *iik = ISA_IPMI_KCS(ii);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue