static void ics_simple_realize(DeviceState *dev, Error **errp) { ICSState *ics = ICS_SIMPLE(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->qirqs = qemu_allocate_irqs(ics_simple_set_irq, ics, ics->nr_irqs); qemu_register_reset(ics_simple_reset, dev); }
static void ics_simple_realize(DeviceState *dev, Error **errp) { ICSState *ics = ICS_SIMPLE(dev); ICSStateClass *icsc = ICS_BASE_GET_CLASS(ics); Error *local_err = NULL; icsc->parent_realize(dev, &local_err); if (local_err) { error_propagate(errp, local_err); return; } qemu_register_reset(ics_simple_reset_handler, ics); }
static void ics_simple_reset(void *dev) { ICSState *ics = ICS_SIMPLE(dev); int i; uint8_t flags[ics->nr_irqs]; for (i = 0; i < ics->nr_irqs; i++) { flags[i] = ics->irqs[i].flags; } memset(ics->irqs, 0, sizeof(ICSIRQState) * ics->nr_irqs); for (i = 0; i < ics->nr_irqs; i++) { ics->irqs[i].priority = 0xff; ics->irqs[i].saved_priority = 0xff; ics->irqs[i].flags = flags[i]; } }
static void ics_simple_initfn(Object *obj) { ICSState *ics = ICS_SIMPLE(obj); ics->offset = XICS_IRQ_BASE; }