static inline void evt_iterate_bits(volatile unsigned long *pendingl1, volatile unsigned long *pendingl2, volatile unsigned long *mask, iterate_func_t iterate_pending, void *iterate_args) { KASSERT(pendingl1 != NULL); KASSERT(pendingl2 != NULL); unsigned long l1, l2; unsigned int l1i, l2i, port; l1 = xen_atomic_xchg(pendingl1, 0); while ((l1i = xen_ffs(l1)) != 0) { l1i--; l1 &= ~(1UL << l1i); l2 = pendingl2[l1i] & (mask != NULL ? ~mask[l1i] : -1UL); l2 &= curcpu()->ci_evtmask[l1i]; if (mask != NULL) xen_atomic_setbits_l(&mask[l1i], l2); xen_atomic_clearbits_l(&pendingl2[l1i], l2); while ((l2i = xen_ffs(l2)) != 0) { l2i--; l2 &= ~(1UL << l2i); port = (l1i << LONG_SHIFT) + l2i; iterate_pending(port, l1i, l2i, iterate_args); } } }
/* process pending events */ static int xenevt_processevt(void *v) { long l1, l2; int l1i, l2i; int port; l1 = xen_atomic_xchg(&xenevt_ev1, 0); while ((l1i = xen_ffs(l1)) != 0) { l1i--; l1 &= ~(1UL << l1i); l2 = xen_atomic_xchg(&xenevt_ev2[l1i], 0); while ((l2i = xen_ffs(l2)) != 0) { l2i--; l2 &= ~(1UL << l2i); port = (l1i << LONG_SHIFT) + l2i; xenevt_event(port); } } return 0; }