diff options
author | Alexey Kardashevskiy <aik@ozlabs.ru> | 2013-09-26 16:18:40 +1000 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2013-10-25 23:25:47 +0200 |
commit | b45ff2d942022d7ee139a153f17f638d87935e03 (patch) | |
tree | 812e6b5d2e3bcc6146848e29b91ef355ce94efa6 /hw/intc | |
parent | d1b5682d88f72f8662ce6d20e07af3adfbf39ed0 (diff) | |
download | qemu-b45ff2d942022d7ee139a153f17f638d87935e03.tar.gz qemu-b45ff2d942022d7ee139a153f17f638d87935e03.tar.bz2 qemu-b45ff2d942022d7ee139a153f17f638d87935e03.zip |
xics: convert init() to realize()
This fixes XICS according new QOM rules.
This converts ICS's init() callbacks to realize().
This converts legacy qdev_init_nofail() to property_set(realized).
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Reviewed-by: Andreas Färber <afaerber@suse.de>
Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'hw/intc')
-rw-r--r-- | hw/intc/xics.c | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/hw/intc/xics.c b/hw/intc/xics.c index eeb64f588e..76654db1d9 100644 --- a/hw/intc/xics.c +++ b/hw/intc/xics.c @@ -479,15 +479,17 @@ static const VMStateDescription vmstate_ics = { }, }; -static int ics_realize(DeviceState *dev) +static void ics_realize(DeviceState *dev, Error **errp) { ICSState *ics = ICS(dev); + if (!ics->nr_irqs) { + error_setg(errp, "Number of interrupts needs to be greater 0"); + return; + } ics->irqs = g_malloc0(ics->nr_irqs * sizeof(ICSIRQState)); ics->islsi = g_malloc0(ics->nr_irqs * sizeof(bool)); ics->qirqs = qemu_allocate_irqs(ics_set_irq, ics, ics->nr_irqs); - - return 0; } static void ics_class_init(ObjectClass *klass, void *data) @@ -495,7 +497,7 @@ static void ics_class_init(ObjectClass *klass, void *data) DeviceClass *dc = DEVICE_CLASS(klass); ICSStateClass *isc = ICS_CLASS(klass); - dc->init = ics_realize; + dc->realize = ics_realize; dc->vmsd = &vmstate_ics; dc->reset = ics_reset; isc->post_load = ics_post_load; @@ -691,8 +693,14 @@ static void xics_realize(DeviceState *dev, Error **errp) { XICSState *icp = XICS(dev); ICSState *ics = icp->ics; + Error *error = NULL; int i; + if (!icp->nr_servers) { + error_setg(errp, "Number of servers needs to be greater 0"); + return; + } + /* Registration of global state belongs into realize */ spapr_rtas_register("ibm,set-xive", rtas_set_xive); spapr_rtas_register("ibm,get-xive", rtas_get_xive); @@ -707,7 +715,11 @@ static void xics_realize(DeviceState *dev, Error **errp) ics->nr_irqs = icp->nr_irqs; ics->offset = XICS_IRQ_BASE; ics->icp = icp; - qdev_init_nofail(DEVICE(ics)); + object_property_set_bool(OBJECT(icp->ics), true, "realized", &error); + if (error) { + error_propagate(errp, error); + return; + } icp->ss = g_malloc0(icp->nr_servers*sizeof(ICPState)); for (i = 0; i < icp->nr_servers; i++) { @@ -715,7 +727,11 @@ static void xics_realize(DeviceState *dev, Error **errp) object_initialize(&icp->ss[i], sizeof(icp->ss[i]), TYPE_ICP); snprintf(buffer, sizeof(buffer), "icp[%d]", i); object_property_add_child(OBJECT(icp), buffer, OBJECT(&icp->ss[i]), NULL); - qdev_init_nofail(DEVICE(&icp->ss[i])); + object_property_set_bool(OBJECT(&icp->ss[i]), true, "realized", &error); + if (error) { + error_propagate(errp, error); + return; + } } } |