Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/hw/core/qdev.c b/hw/core/qdev.c
- index f6f92473b8..e14164526f 100644
- --- a/hw/core/qdev.c
- +++ b/hw/core/qdev.c
- @@ -345,6 +345,22 @@ void qdev_init_nofail(DeviceState *dev)
- object_unref(OBJECT(dev));
- }
- +void qdev_cleanup_nofail(DeviceState *dev)
- +{
- + Error *err = NULL;
- +
- + assert(dev->realized);
- +
- + object_ref(OBJECT(dev));
- + object_property_set_bool(OBJECT(dev), false, "realized", &err);
- + if (err) {
- + error_reportf_err(err, "Clean up of device %s failed: ",
- + object_get_typename(OBJECT(dev)));
- + exit(1);
- + }
- + object_unref(OBJECT(dev));
- +}
- +
- void qdev_machine_creation_done(void)
- {
- /*
- diff --git a/hw/dma/i82374.c b/hw/dma/i82374.c
- index 83c87d92e0..593183b869 100644
- --- a/hw/dma/i82374.c
- +++ b/hw/dma/i82374.c
- @@ -25,6 +25,7 @@
- #include "qemu/osdep.h"
- #include "hw/isa/isa.h"
- #include "hw/dma/i8257.h"
- +#include "qapi/error.h"
- #define TYPE_I82374 "i82374"
- #define I82374(obj) OBJECT_CHECK(I82374State, (obj), TYPE_I82374)
- diff --git a/hw/dma/i8257.c b/hw/dma/i8257.c
- index 52675e97c9..70cbc156c3 100644
- --- a/hw/dma/i8257.c
- +++ b/hw/dma/i8257.c
- @@ -625,23 +625,27 @@ type_init(i8257_register_types)
- void i8257_dma_init(ISABus *bus, bool high_page_enable)
- {
- ISADevice *isa1, *isa2;
- - DeviceState *d;
- + DeviceState *d1, *d2;
- isa1 = isa_create(bus, TYPE_I8257);
- - d = DEVICE(isa1);
- - qdev_prop_set_int32(d, "base", 0x00);
- - qdev_prop_set_int32(d, "page-base", 0x80);
- - qdev_prop_set_int32(d, "pageh-base", high_page_enable ? 0x480 : -1);
- - qdev_prop_set_int32(d, "dshift", 0);
- - qdev_init_nofail(d);
- + d1 = DEVICE(isa1);
- + qdev_prop_set_int32(d1, "base", 0x00);
- + qdev_prop_set_int32(d1, "page-base", 0x80);
- + qdev_prop_set_int32(d1, "pageh-base", high_page_enable ? 0x480 : -1);
- + qdev_prop_set_int32(d1, "dshift", 0);
- + qdev_init_nofail(d1);
- isa2 = isa_create(bus, TYPE_I8257);
- - d = DEVICE(isa2);
- - qdev_prop_set_int32(d, "base", 0xc0);
- - qdev_prop_set_int32(d, "page-base", 0x88);
- - qdev_prop_set_int32(d, "pageh-base", high_page_enable ? 0x488 : -1);
- - qdev_prop_set_int32(d, "dshift", 1);
- - qdev_init_nofail(d);
- -
- - isa_bus_dma(bus, ISADMA(isa1), ISADMA(isa2));
- + d2 = DEVICE(isa2);
- + qdev_prop_set_int32(d2, "base", 0xc0);
- + qdev_prop_set_int32(d2, "page-base", 0x88);
- + qdev_prop_set_int32(d2, "pageh-base", high_page_enable ? 0x488 : -1);
- + qdev_prop_set_int32(d2, "dshift", 1);
- + qdev_init_nofail(d2);
- +
- + if (isa_bus_dma(bus, ISADMA(isa1), ISADMA(isa2)) < 0) {
- + qdev_cleanup_nofail(d1);
- + qdev_cleanup_nofail(d2);
- + exit(1);
- + }
- }
- diff --git a/hw/isa/isa-bus.c b/hw/isa/isa-bus.c
- index 63fa77effc..5b1a2240e9 100644
- --- a/hw/isa/isa-bus.c
- +++ b/hw/isa/isa-bus.c
- @@ -107,7 +107,10 @@ void isa_connect_gpio_out(ISADevice *isadev, int gpioirq, int isairq)
- void isa_bus_dma(ISABus *bus, IsaDma *dma8, IsaDma *dma16)
- {
- assert(bus && dma8 && dma16);
- - assert(!bus->dma[0] && !bus->dma[1]);
- + if (bus->dma[0] || bus->dma[1]) {
- + error_setg(errp, "DMA already initialized on ISA bus");
- + exit(1);
- + }
- bus->dma[0] = dma8;
- bus->dma[1] = dma16;
- }
- diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
- index 9453588160..238ad2f6f3 100644
- --- a/include/hw/qdev-core.h
- +++ b/include/hw/qdev-core.h
- @@ -283,6 +283,7 @@ typedef struct GlobalProperty {
- DeviceState *qdev_create(BusState *bus, const char *name);
- DeviceState *qdev_try_create(BusState *bus, const char *name);
- void qdev_init_nofail(DeviceState *dev);
- +void qdev_cleanup_nofail(DeviceState *dev);
- void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
- int required_for_version);
- HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement