Index: sys/arm64/xen/xen_arch_intr.c =================================================================== --- sys/arm64/xen/xen_arch_intr.c +++ sys/arm64/xen/xen_arch_intr.c @@ -86,17 +86,44 @@ /* Nothing to do */ } -int -xen_arch_intr_setup(struct xenisrc *isrc) +struct xenisrc * +xen_arch_intr_alloc(struct malloc_type *mtype, const char *name, + enum evtchn_type type, evtchn_port_t port) { + struct xenisrc *isrc; + int error; + + if (!(isrc = malloc(sizeof(struct xenisrc), mtype, M_WAITOK | M_ZERO))) + return (NULL); - return (intr_event_create(&isrc->xi_arch, isrc, 0, - isrc->xi_vector /* IRQ */, + /* due to quirks of another architecture, arch MUST set this */ + isrc->xi_type = type; + + /* xen_intr_assign_cpu() requires this to be set */ + isrc->xi_port = port; + + error = intr_event_create(&isrc->xi_arch, isrc, 0, + isrc->xi_port /* event channel number */, xen_intr_arch_disable_source /* mask */, xen_intr_arch_enable_source /* unmask */, xen_intr_arch_eoi_source /* EOI */, xen_intr_arch_assign_cpu /* cpu assign */, - "xen%d", isrc->xi_port)); + "xen%d", isrc->xi_port); + + if (error) { + free(isrc, mtype); + isrc = NULL; + } + + return (isrc); +} + +void +xen_arch_intr_release(struct malloc_type *mtype, struct xenisrc *isrc) +{ + intr_event_destroy(isrc->xi_arch); + + free(isrc, mtype); } bool