diff --git a/sys/x86/xen/xen_intr.c b/sys/x86/xen/xen_intr.c index a964fac..f32114b3 100644 --- a/sys/x86/xen/xen_intr.c +++ b/sys/x86/xen/xen_intr.c @@ -578,12 +578,11 @@ xen_intr_handle_upcall(struct trapframe *trap_frame) /* process port */ port = (l1i * LONG_BIT) + l2i; + synch_clear_bit(port, &s->evtchn_pending[0]); isrc = xen_intr_port_to_isrc[port]; - if (__predict_false(isrc == NULL)) { - synch_clear_bit(port, &s->evtchn_pending[0]); + if (__predict_false(isrc == NULL)) continue; - } /* Make sure we are firing on the right vCPU */ KASSERT((isrc->xi_cpu == PCPU_GET(cpuid)), @@ -930,11 +929,12 @@ out: * acknowledgements. */ static void -xen_intr_disable_source(struct intsrc *isrc, int eoi) +xen_intr_disable_source(struct intsrc *base_isrc, int eoi) { + struct xenisrc *isrc; - if (eoi == PIC_EOI) - xen_intr_eoi_source(isrc); + isrc = (struct xenisrc *)base_isrc; + evtchn_mask_port(isrc->xi_port); } /* @@ -943,8 +943,12 @@ xen_intr_disable_source(struct intsrc *isrc, int eoi) * \param isrc The interrupt source to unmask (if necessary). */ static void -xen_intr_enable_source(struct intsrc *isrc) +xen_intr_enable_source(struct intsrc *base_isrc) { + struct xenisrc *isrc; + + isrc = (struct xenisrc *)base_isrc; + evtchn_unmask_port(isrc->xi_port); } /* @@ -953,13 +957,8 @@ xen_intr_enable_source(struct intsrc *isrc) * \param isrc The interrupt source to EOI. */ static void -xen_intr_eoi_source(struct intsrc *base_isrc) +xen_intr_eoi_source(struct intsrc *isrc) { - struct xenisrc *isrc; - - isrc = (struct xenisrc *)base_isrc; - synch_clear_bit(isrc->xi_port, - &HYPERVISOR_shared_info->evtchn_pending[0]); } /* @@ -1025,8 +1024,6 @@ xen_intr_pirq_eoi_source(struct intsrc *base_isrc) isrc = (struct xenisrc *)base_isrc; - synch_clear_bit(isrc->xi_port, - &HYPERVISOR_shared_info->evtchn_pending[0]); if (test_bit(isrc->xi_pirq, xen_intr_pirq_eoi_map)) { struct physdev_eoi eoi = { .irq = isrc->xi_pirq };