int (*ioapic_renumber_irq)(int ioapic, int irq);
atomic_t irq_mis_count;
-int msi_enable = 0;
-boolean_param("msi", msi_enable);
-
int domain_irq_to_vector(struct domain *d, int irq)
{
- if ( !msi_enable )
- return irq_to_vector(irq);
- else
- return d->arch.pirq_vector[irq];
+ return d->arch.pirq_vector[irq];
}
int domain_vector_to_irq(struct domain *d, int vector)
{
- if ( !msi_enable )
- return vector_to_irq(vector);
- else
- return d->arch.vector_pirq[vector];
+ return d->arch.vector_pirq[vector];
}
/* Where if anywhere is the i8259 connect in external int mode */
/* The pirq should have been unbound before this call. */
static int unmap_domain_pirq(struct domain *d, int pirq)
{
- int ret = 0;
- int vector;
+ unsigned long flags;
+ irq_desc_t *desc;
+ int vector, ret = 0;
if ( d == NULL || pirq < 0 || pirq >= NR_PIRQS )
return -EINVAL;
gdprintk(XENLOG_G_ERR, "domain %X: pirq %x not mapped still\n",
d->domain_id, pirq);
ret = -EINVAL;
+ goto done;
}
- else
- {
- unsigned long flags;
- irq_desc_t *desc;
- desc = &irq_desc[vector];
- spin_lock_irqsave(&desc->lock, flags);
- if ( desc->msi_desc )
- pci_disable_msi(vector);
-
- if ( desc->handler == &pci_msi_type )
- {
- /* MSI is not shared, so should be released already */
- BUG_ON(desc->status & IRQ_GUEST);
- irq_desc[vector].handler = &no_irq_type;
- }
- spin_unlock_irqrestore(&desc->lock, flags);
+ desc = &irq_desc[vector];
+ spin_lock_irqsave(&desc->lock, flags);
+ if ( desc->msi_desc )
+ pci_disable_msi(vector);
- d->arch.pirq_vector[pirq] = d->arch.vector_pirq[vector] = 0;
+ if ( desc->handler == &pci_msi_type )
+ {
+ /* MSI is not shared, so should be released already */
+ BUG_ON(desc->status & IRQ_GUEST);
+ irq_desc[vector].handler = &no_irq_type;
}
+ spin_unlock_irqrestore(&desc->lock, flags);
- ret = irq_deny_access(d, pirq);
+ d->arch.pirq_vector[pirq] = d->arch.vector_pirq[vector] = 0;
+ ret = irq_deny_access(d, pirq);
if ( ret )
gdprintk(XENLOG_G_ERR, "deny irq %x access failed\n", pirq);
+ done:
return ret;
}
int vector, pirq, ret = 0;
unsigned long flags;
- /* if msi_enable is not enabled, map always succeeds */
- if ( !msi_enable )
- return 0;
-
if ( !IS_PRIV(current->domain) )
return -EPERM;
unsigned long flags;
int ret;
- if ( !msi_enable )
- return 0;
-
if ( !IS_PRIV(current->domain) )
return -EPERM;
- if ( !unmap )
- return -EINVAL;
-
if ( unmap->domid == DOMID_SELF )
d = rcu_lock_domain(current->domain);
else
d = rcu_lock_domain_by_id(unmap->domid);
if ( d == NULL )
- {
- rcu_unlock_domain(d);
return -ESRCH;
- }
spin_lock_irqsave(&d->arch.irq_lock, flags);
ret = unmap_domain_pirq(d, unmap->pirq);
spin_unlock_irqrestore(&d->arch.irq_lock, flags);
+
rcu_unlock_domain(d);
return ret;
irq_op.vector = assign_irq_vector(irq);
- ret = 0;
-
- if ( msi_enable )
- {
- spin_lock_irqsave(&dom0->arch.irq_lock, flags);
- ret = map_domain_pirq(dom0, irq_op.irq, irq_op.vector, NULL);
- spin_unlock_irqrestore(&dom0->arch.irq_lock, flags);
- }
+ spin_lock_irqsave(&dom0->arch.irq_lock, flags);
+ ret = map_domain_pirq(dom0, irq_op.irq, irq_op.vector, NULL);
+ spin_unlock_irqrestore(&dom0->arch.irq_lock, flags);
if ( copy_to_guest(arg, &irq_op, 1) != 0 )
ret = -EFAULT;