aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/hvm/irq.c
diff options
context:
space:
mode:
authorkaf24@localhost.localdomain <kaf24@localhost.localdomain>2006-12-28 16:33:15 +0000
committerkaf24@localhost.localdomain <kaf24@localhost.localdomain>2006-12-28 16:33:15 +0000
commit0f30bdcf5fd6064b9697686974d6a4439eb1233f (patch)
tree0827d9750edc1d87e7dd6a2725ba1cf47029e6c3 /xen/arch/x86/hvm/irq.c
parentb1da15c72bfed186c0aa3f981410c019885f0c05 (diff)
downloadxen-0f30bdcf5fd6064b9697686974d6a4439eb1233f.tar.gz
xen-0f30bdcf5fd6064b9697686974d6a4439eb1233f.tar.bz2
xen-0f30bdcf5fd6064b9697686974d6a4439eb1233f.zip
[HVM] Fix assumptions that ISA IRQ 0 connects to GSI 0.
Signed-off-by: Keir Fraser <keir@xensource.com>
Diffstat (limited to 'xen/arch/x86/hvm/irq.c')
-rw-r--r--xen/arch/x86/hvm/irq.c28
1 files changed, 15 insertions, 13 deletions
diff --git a/xen/arch/x86/hvm/irq.c b/xen/arch/x86/hvm/irq.c
index e9f975eb53..1b51f5905c 100644
--- a/xen/arch/x86/hvm/irq.c
+++ b/xen/arch/x86/hvm/irq.c
@@ -85,7 +85,7 @@ void hvm_isa_irq_assert(
struct domain *d, unsigned int isa_irq)
{
struct hvm_irq *hvm_irq = &d->arch.hvm_domain.irq;
- unsigned int gsi = (isa_irq == 0) ? 2 : isa_irq;
+ unsigned int gsi = hvm_isa_irq_to_gsi(isa_irq);
ASSERT(isa_irq <= 15);
@@ -105,7 +105,7 @@ void hvm_isa_irq_deassert(
struct domain *d, unsigned int isa_irq)
{
struct hvm_irq *hvm_irq = &d->arch.hvm_domain.irq;
- unsigned int gsi = (isa_irq == 0) ? 2 : isa_irq;
+ unsigned int gsi = hvm_isa_irq_to_gsi(isa_irq);
ASSERT(isa_irq <= 15);
@@ -257,23 +257,25 @@ int cpu_get_interrupt(struct vcpu *v, int *type)
return -1;
}
-int get_intr_vector(struct vcpu* v, int irq, int type)
+int get_isa_irq_vector(struct vcpu *v, int isa_irq, int type)
{
+ unsigned int gsi = hvm_isa_irq_to_gsi(isa_irq);
+
if ( type == APIC_DM_EXTINT )
- return v->domain->arch.hvm_domain.irq.vpic[irq >> 3].irq_base
- + (irq & 0x7);
+ return (v->domain->arch.hvm_domain.irq.vpic[isa_irq >> 3].irq_base
+ + (isa_irq & 7));
- return domain_vioapic(v->domain)->redirtbl[irq].fields.vector;
+ return domain_vioapic(v->domain)->redirtbl[gsi].fields.vector;
}
-int is_irq_masked(struct vcpu *v, int irq)
+int is_isa_irq_masked(struct vcpu *v, int isa_irq)
{
- if ( is_lvtt(v, irq) )
- return !is_lvtt_enabled(v);
+ unsigned int gsi = hvm_isa_irq_to_gsi(isa_irq);
- if ( v->domain->arch.hvm_domain.irq.vpic[irq >> 3].imr & (1 << (irq & 7))
- && domain_vioapic(v->domain)->redirtbl[irq].fields.mask )
- return 1;
+ if ( is_lvtt(v, isa_irq) )
+ return !is_lvtt_enabled(v);
- return 0;
+ return ((v->domain->arch.hvm_domain.irq.vpic[isa_irq >> 3].imr &
+ (1 << (isa_irq & 7))) &&
+ domain_vioapic(v->domain)->redirtbl[gsi].fields.mask);
}