void do_irq() { unsigned int irq = gic_acknowledge_irq(); if (irq == SPURIOUS_IRQ) return; if (table[irq]) table[irq](); gic_complete_irq(irq); }
static uint32_t gic_cpu_read(void *opaque, target_phys_addr_t offset) { gic_state *s = (gic_state *)opaque; offset -= s->base; switch (offset) { case 0x00: /* Control */ return s->cpu_enabled; case 0x04: /* Priority mask */ return s->priority_mask; case 0x08: /* Binary Point */ /* ??? Not implemented. */ return 0; case 0x0c: /* Acknowledge */ return gic_acknowledge_irq(s); case 0x14: /* Runing Priority */ return s->running_priority; case 0x18: /* Highest Pending Interrupt */ return s->current_pending; default: cpu_abort (cpu_single_env, "gic_cpu_writeb: Bad offset %x\n", offset); return 0; } }