Advertisement
otubo

Untitled

Mar 26th, 2018
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 3.85 KB | None | 0 0
  1. diff --git a/hw/core/qdev.c b/hw/core/qdev.c
  2. index f6f92473b8..e14164526f 100644
  3. --- a/hw/core/qdev.c
  4. +++ b/hw/core/qdev.c
  5. @@ -345,6 +345,22 @@ void qdev_init_nofail(DeviceState *dev)
  6.      object_unref(OBJECT(dev));
  7.  }
  8.  
  9. +void qdev_cleanup_nofail(DeviceState *dev)
  10. +{
  11. +    Error *err = NULL;
  12. +
  13. +    assert(dev->realized);
  14. +
  15. +    object_ref(OBJECT(dev));
  16. +    object_property_set_bool(OBJECT(dev), false, "realized", &err);
  17. +    if (err) {
  18. +        error_reportf_err(err, "Clean up of device %s failed: ",
  19. +                          object_get_typename(OBJECT(dev)));
  20. +        exit(1);
  21. +    }
  22. +    object_unref(OBJECT(dev));
  23. +}
  24. +
  25.  void qdev_machine_creation_done(void)
  26.  {
  27.      /*
  28. diff --git a/hw/dma/i82374.c b/hw/dma/i82374.c
  29. index 83c87d92e0..593183b869 100644
  30. --- a/hw/dma/i82374.c
  31. +++ b/hw/dma/i82374.c
  32. @@ -25,6 +25,7 @@
  33.  #include "qemu/osdep.h"
  34.  #include "hw/isa/isa.h"
  35.  #include "hw/dma/i8257.h"
  36. +#include "qapi/error.h"
  37.  
  38.  #define TYPE_I82374 "i82374"
  39.  #define I82374(obj) OBJECT_CHECK(I82374State, (obj), TYPE_I82374)
  40. diff --git a/hw/dma/i8257.c b/hw/dma/i8257.c
  41. index 52675e97c9..70cbc156c3 100644
  42. --- a/hw/dma/i8257.c
  43. +++ b/hw/dma/i8257.c
  44. @@ -625,23 +625,27 @@ type_init(i8257_register_types)
  45.  void i8257_dma_init(ISABus *bus, bool high_page_enable)
  46.  {
  47.      ISADevice *isa1, *isa2;
  48. -    DeviceState *d;
  49. +    DeviceState *d1, *d2;
  50.  
  51.      isa1 = isa_create(bus, TYPE_I8257);
  52. -    d = DEVICE(isa1);
  53. -    qdev_prop_set_int32(d, "base", 0x00);
  54. -    qdev_prop_set_int32(d, "page-base", 0x80);
  55. -    qdev_prop_set_int32(d, "pageh-base", high_page_enable ? 0x480 : -1);
  56. -    qdev_prop_set_int32(d, "dshift", 0);
  57. -    qdev_init_nofail(d);
  58. +    d1 = DEVICE(isa1);
  59. +    qdev_prop_set_int32(d1, "base", 0x00);
  60. +    qdev_prop_set_int32(d1, "page-base", 0x80);
  61. +    qdev_prop_set_int32(d1, "pageh-base", high_page_enable ? 0x480 : -1);
  62. +    qdev_prop_set_int32(d1, "dshift", 0);
  63. +    qdev_init_nofail(d1);
  64.  
  65.      isa2 = isa_create(bus, TYPE_I8257);
  66. -    d = DEVICE(isa2);
  67. -    qdev_prop_set_int32(d, "base", 0xc0);
  68. -    qdev_prop_set_int32(d, "page-base", 0x88);
  69. -    qdev_prop_set_int32(d, "pageh-base", high_page_enable ? 0x488 : -1);
  70. -    qdev_prop_set_int32(d, "dshift", 1);
  71. -    qdev_init_nofail(d);
  72. -
  73. -    isa_bus_dma(bus, ISADMA(isa1), ISADMA(isa2));
  74. +    d2 = DEVICE(isa2);
  75. +    qdev_prop_set_int32(d2, "base", 0xc0);
  76. +    qdev_prop_set_int32(d2, "page-base", 0x88);
  77. +    qdev_prop_set_int32(d2, "pageh-base", high_page_enable ? 0x488 : -1);
  78. +    qdev_prop_set_int32(d2, "dshift", 1);
  79. +    qdev_init_nofail(d2);
  80. +
  81. +    if (isa_bus_dma(bus, ISADMA(isa1), ISADMA(isa2)) < 0) {
  82. +        qdev_cleanup_nofail(d1);
  83. +        qdev_cleanup_nofail(d2);
  84. +        exit(1);
  85. +    }
  86.  }
  87. diff --git a/hw/isa/isa-bus.c b/hw/isa/isa-bus.c
  88. index 63fa77effc..5b1a2240e9 100644
  89. --- a/hw/isa/isa-bus.c
  90. +++ b/hw/isa/isa-bus.c
  91. @@ -107,7 +107,10 @@ void isa_connect_gpio_out(ISADevice *isadev, int gpioirq, int isairq)
  92.  void isa_bus_dma(ISABus *bus, IsaDma *dma8, IsaDma *dma16)
  93.  {
  94.      assert(bus && dma8 && dma16);
  95. -    assert(!bus->dma[0] && !bus->dma[1]);
  96. +    if (bus->dma[0] || bus->dma[1]) {
  97. +        error_setg(errp, "DMA already initialized on ISA bus");
  98. +        exit(1);
  99. +    }
  100.      bus->dma[0] = dma8;
  101.      bus->dma[1] = dma16;
  102.  }
  103. diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
  104. index 9453588160..238ad2f6f3 100644
  105. --- a/include/hw/qdev-core.h
  106. +++ b/include/hw/qdev-core.h
  107. @@ -283,6 +283,7 @@ typedef struct GlobalProperty {
  108.  DeviceState *qdev_create(BusState *bus, const char *name);
  109.  DeviceState *qdev_try_create(BusState *bus, const char *name);
  110.  void qdev_init_nofail(DeviceState *dev);
  111. +void qdev_cleanup_nofail(DeviceState *dev);
  112.  void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
  113.                                   int required_for_version);
  114.  HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement