return NULL;
}
-struct hvm_vioapic *gsi_vioapic(const struct domain *d, unsigned int gsi,
- unsigned int *pin)
+static struct hvm_vioapic *gsi_vioapic(const struct domain *d,
+ unsigned int gsi, unsigned int *pin)
{
unsigned int i;
spin_unlock(&d->arch.hvm_domain.irq_lock);
}
+int vioapic_get_mask(const struct domain *d, unsigned int gsi)
+{
+ unsigned int pin;
+ const struct hvm_vioapic *vioapic = gsi_vioapic(d, gsi, &pin);
+
+ if ( !vioapic )
+ return -EINVAL;
+
+ return vioapic->redirtbl[pin].fields.mask;
+}
+
+int vioapic_get_vector(const struct domain *d, unsigned int gsi)
+{
+ unsigned int pin;
+ const struct hvm_vioapic *vioapic = gsi_vioapic(d, gsi, &pin);
+
+ if ( !vioapic )
+ return -EINVAL;
+
+ return vioapic->redirtbl[pin].fields.vector;
+}
+
static int ioapic_save(struct domain *d, hvm_domain_context_t *h)
{
struct hvm_vioapic *s;
static int pt_irq_vector(struct periodic_time *pt, enum hvm_intsrc src)
{
struct vcpu *v = pt->vcpu;
- struct hvm_vioapic *vioapic;
- unsigned int gsi, isa_irq, pin;
+ unsigned int gsi, isa_irq;
+ int vector;
if ( pt->source == PTSRC_lapic )
return pt->irq;
+ (isa_irq & 7));
ASSERT(src == hvm_intsrc_lapic);
- vioapic = gsi_vioapic(v->domain, gsi, &pin);
- if ( !vioapic )
+ vector = vioapic_get_vector(v->domain, gsi);
+ if ( vector < 0 )
{
dprintk(XENLOG_WARNING, "d%u: invalid GSI (%u) for platform timer\n",
v->domain->domain_id, gsi);
return -1;
}
- return vioapic->redirtbl[pin].fields.vector;
+ return vector;
}
static int pt_irq_masked(struct periodic_time *pt)
{
struct vcpu *v = pt->vcpu;
- unsigned int gsi, isa_irq, pin;
- struct hvm_vioapic *vioapic;
+ unsigned int gsi, isa_irq;
+ int mask;
uint8_t pic_imr;
if ( pt->source == PTSRC_lapic )
isa_irq = pt->irq;
gsi = hvm_isa_irq_to_gsi(isa_irq);
pic_imr = v->domain->arch.hvm_domain.vpic[isa_irq >> 3].imr;
- vioapic = gsi_vioapic(v->domain, gsi, &pin);
- if ( !vioapic )
+ mask = vioapic_get_mask(v->domain, gsi);
+ if ( mask < 0 )
{
dprintk(XENLOG_WARNING, "d%u: invalid GSI (%u) for platform timer\n",
v->domain->domain_id, gsi);
}
return (((pic_imr & (1 << (isa_irq & 7))) || !vlapic_accept_pic_intr(v)) &&
- vioapic->redirtbl[pin].fields.mask);
+ mask);
}
static void pt_lock(struct periodic_time *pt)
#define domain_vioapic(d, i) ((d)->arch.hvm_domain.vioapic[i])
#define vioapic_domain(v) ((v)->domain)
-struct hvm_vioapic *gsi_vioapic(const struct domain *d, unsigned int gsi,
- unsigned int *pin);
-
int vioapic_init(struct domain *d);
void vioapic_deinit(struct domain *d);
void vioapic_reset(struct domain *d);
void vioapic_irq_positive_edge(struct domain *d, unsigned int irq);
void vioapic_update_EOI(struct domain *d, u8 vector);
+int vioapic_get_mask(const struct domain *d, unsigned int gsi);
+int vioapic_get_vector(const struct domain *d, unsigned int gsi);
+
#endif /* __ASM_X86_HVM_VIOAPIC_H__ */