/* 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);
		}
	}
}
Beispiel #2
0
/* 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);
		}
	}
}