/* Update interrupts. */ static void pl190_update(struct pl190_emulator_state *s) { u32 status; struct vmm_vcpu *vcpu = vmm_manager_guest_vcpu(s->guest, 0); if (!vcpu) { return; } status = pl190_irq_status(s); if (s->is_child_pic) { vmm_devemu_emulate_irq(s->guest, s->parent_irq, status); } else { if (status & s->prio_mask[s->priority]) { vmm_vcpu_irq_assert(vcpu, s->parent_irq, 0x0); } else { vmm_vcpu_irq_deassert(vcpu, s->parent_irq); } if ((s->level | s->soft_level) & s->fiq_select) { vmm_vcpu_irq_assert(vcpu, s->parent_irq + 1, 0x0); } else { vmm_vcpu_irq_deassert(vcpu, s->parent_irq + 1); } } }
/* Update interrupts. */ static void pl190_emulator_update(struct pl190_emulator_state *s) { u32 irqset, fiqset, status; struct vmm_vcpu *vcpu = vmm_manager_guest_vcpu(s->guest, 0); if (!vcpu) { return; } status = pl190_emulator_irq_status(s); if (s->is_child_pic) { vmm_devemu_emulate_irq(s->guest, s->parent_irq, status); } else { irqset = ((status & s->prio_mask[s->priority]) != 0); if (irqset) { vmm_vcpu_irq_assert(vcpu, CPU_EXTERNAL_IRQ, 0x0); } else { vmm_vcpu_irq_deassert(vcpu, CPU_EXTERNAL_IRQ); } fiqset = (((s->level | s->soft_level) & s->fiq_select) != 0); if (fiqset) { vmm_vcpu_irq_assert(vcpu, CPU_EXTERNAL_FIQ, 0x0); } else { vmm_vcpu_irq_deassert(vcpu, CPU_EXTERNAL_FIQ); } } }