goto out;
hvm_irq->pci_link.route[link] = isa_irq;
+ /* PCI pass-through fixup. */
+ if ( hvm_irq->dpci && hvm_irq->dpci->girq[old_isa_irq].valid )
+ {
+ uint32_t device = hvm_irq->dpci->girq[old_isa_irq].device;
+ uint32_t intx = hvm_irq->dpci->girq[old_isa_irq].intx;
+ if ( link == hvm_pci_intx_link(device, intx) )
+ {
+ hvm_irq->dpci->girq[isa_irq] = hvm_irq->dpci->girq[old_isa_irq];
+ hvm_irq->dpci->girq[old_isa_irq].valid = 0;
+ }
+ }
+
if ( hvm_irq->pci_link_assert_count[link] == 0 )
goto out;
struct hvm_irq_dpci *hvm_irq_dpci = d->arch.hvm_domain.irq.dpci;
uint32_t machine_gsi, guest_gsi;
uint32_t device, intx;
+ uint32_t link, isa_irq;
if ( hvm_irq_dpci == NULL )
{
device = pt_irq_bind->u.pci.device;
intx = pt_irq_bind->u.pci.intx;
guest_gsi = hvm_pci_intx_gsi(device, intx);
+ link = hvm_pci_intx_link(device, intx);
+ isa_irq = d->arch.hvm_domain.irq.pci_link.route[link];
hvm_irq_dpci->mirq[machine_gsi].valid = 1;
hvm_irq_dpci->mirq[machine_gsi].device = device;
hvm_irq_dpci->girq[guest_gsi].machine_gsi = machine_gsi;
hvm_irq_dpci->girq[guest_gsi].dom = d;
+ hvm_irq_dpci->girq[isa_irq].valid = 1;
+ hvm_irq_dpci->girq[isa_irq].device = device;
+ hvm_irq_dpci->girq[isa_irq].intx = intx;
+ hvm_irq_dpci->girq[isa_irq].machine_gsi = machine_gsi;
+ hvm_irq_dpci->girq[isa_irq].dom = d;
+
init_timer(&hvm_irq_dpci->hvm_timer[irq_to_vector(machine_gsi)],
pt_irq_time_out, &hvm_irq_dpci->mirq[machine_gsi], 0);
int hvm_do_IRQ_dpci(struct domain *d, unsigned int mirq)
{
- uint32_t device, intx;
- uint32_t link, isa_irq;
struct hvm_irq *hvm_irq = &d->arch.hvm_domain.irq;
if ( !vtd_enabled || (d == dom0) || (hvm_irq->dpci == NULL) ||
!hvm_irq->dpci->mirq[mirq].valid )
return 0;
- device = hvm_irq->dpci->mirq[mirq].device;
- intx = hvm_irq->dpci->mirq[mirq].intx;
- link = hvm_pci_intx_link(device, intx);
- isa_irq = hvm_irq->pci_link.route[link];
-
- if ( !hvm_irq->dpci->girq[isa_irq].valid )
- {
- hvm_irq->dpci->girq[isa_irq].valid = 1;
- hvm_irq->dpci->girq[isa_irq].device = device;
- hvm_irq->dpci->girq[isa_irq].intx = intx;
- hvm_irq->dpci->girq[isa_irq].machine_gsi = mirq;
- }
-
/*
* Set a timer here to avoid situations where the IRQ line is shared, and
* the device belonging to the pass-through guest is not yet active. In