Index: sys/x86/include/intr_machdep.h =================================================================== --- sys/x86/include/intr_machdep.h +++ sys/x86/include/intr_machdep.h @@ -140,15 +140,15 @@ #ifdef SMP void intr_add_cpu(u_int cpu); #endif -int intr_add_handler(const char *name, int vector, driver_filter_t filter, - driver_intr_t handler, void *arg, enum intr_type flags, void **cookiep, - int domain); +int intr_add_handler(const char *name, struct intsrc *isrc, + driver_filter_t filter, driver_intr_t handler, void *arg, + enum intr_type flags, void **cookiep, int domain); #ifdef SMP -int intr_bind(u_int vector, u_char cpu); +int intr_bind(struct intsrc *isrc, u_char cpu); #endif -int intr_config_intr(int vector, enum intr_trigger trig, +int intr_config_intr(struct intsrc *isrc, enum intr_trigger trig, enum intr_polarity pol); -int intr_describe(u_int vector, void *ih, const char *descr); +int intr_describe(struct intsrc *isrc, void *ih, const char *descr); void intr_execute_handlers(struct intsrc *isrc, struct trapframe *frame); u_int intr_next_cpu(int domain); struct intsrc *intr_lookup_source(int vector); Index: sys/x86/x86/intr_machdep.c =================================================================== --- sys/x86/x86/intr_machdep.c +++ sys/x86/x86/intr_machdep.c @@ -258,16 +258,12 @@ } int -intr_add_handler(const char *name, int vector, driver_filter_t filter, +intr_add_handler(const char *name, struct intsrc *isrc, driver_filter_t filter, driver_intr_t handler, void *arg, enum intr_type flags, void **cookiep, int domain) { - struct intsrc *isrc; int error; - isrc = intr_lookup_source(vector); - if (isrc == NULL) - return (EINVAL); error = intr_event_add_handler(isrc->is_event, name, filter, handler, arg, intr_priority(flags), flags, cookiep); if (error == 0) { @@ -306,13 +302,10 @@ } int -intr_config_intr(int vector, enum intr_trigger trig, enum intr_polarity pol) +intr_config_intr(struct intsrc *isrc, enum intr_trigger trig, + enum intr_polarity pol) { - struct intsrc *isrc; - isrc = intr_lookup_source(vector); - if (isrc == NULL) - return (EINVAL); return (isrc->is_pic->pic_config_intr(isrc, trig, pol)); } @@ -524,14 +517,10 @@ /* Add a description to an active interrupt handler. */ int -intr_describe(u_int vector, void *ih, const char *descr) +intr_describe(struct intsrc *isrc, void *ih, const char *descr) { - struct intsrc *isrc; int error; - isrc = intr_lookup_source(vector); - if (isrc == NULL) - return (EINVAL); error = intr_event_describe_handler(isrc->is_event, ih, descr); if (error) return (error); @@ -632,13 +621,9 @@ /* Attempt to bind the specified IRQ to the specified CPU. */ int -intr_bind(u_int vector, u_char cpu) +intr_bind(struct intsrc *isrc, u_char cpu) { - struct intsrc *isrc; - isrc = intr_lookup_source(vector); - if (isrc == NULL) - return (EINVAL); return (intr_event_bind(isrc->is_event, cpu)); } Index: sys/x86/x86/nexus.c =================================================================== --- sys/x86/x86/nexus.c +++ sys/x86/x86/nexus.c @@ -577,6 +577,7 @@ void *arg, void **cookiep) { int error, domain; + struct intsrc *isrc; /* somebody tried to setup an irq that failed to allocate! */ if (irq == NULL) @@ -595,8 +596,11 @@ if (bus_get_domain(child, &domain) != 0) domain = 0; - error = intr_add_handler(device_get_nameunit(child), - rman_get_start(irq), filter, ihand, arg, flags, cookiep, domain); + isrc = intr_lookup_source(rman_get_start(irq)); + if (isrc == NULL) + return (EINVAL); + error = intr_add_handler(device_get_nameunit(child), isrc, + filter, ihand, arg, flags, cookiep, domain); if (error == 0) rman_set_irq_cookie(irq, *cookiep); @@ -630,7 +634,12 @@ static int nexus_bind_intr(device_t dev, device_t child, struct resource *irq, int cpu) { - return (intr_bind(rman_get_start(irq), cpu)); + struct intsrc *isrc; + + isrc = intr_lookup_source(rman_get_start(irq)); + if (isrc == NULL) + return (EINVAL); + return (intr_bind(isrc, cpu)); } #endif @@ -638,15 +647,24 @@ nexus_config_intr(device_t dev, int irq, enum intr_trigger trig, enum intr_polarity pol) { - return (intr_config_intr(irq, trig, pol)); + struct intsrc *isrc; + + isrc = intr_lookup_source(irq); + if (isrc == NULL) + return (EINVAL); + return (intr_config_intr(isrc, trig, pol)); } static int nexus_describe_intr(device_t dev, device_t child, struct resource *irq, void *cookie, const char *descr) { + struct intsrc *isrc; - return (intr_describe(rman_get_start(irq), cookie, descr)); + isrc = intr_lookup_source(rman_get_start(irq)); + if (isrc == NULL) + return (EINVAL); + return (intr_describe(isrc, cookie, descr)); } static struct resource_list * Index: sys/x86/xen/xen_intr.c =================================================================== --- sys/x86/xen/xen_intr.c +++ sys/x86/xen/xen_intr.c @@ -1204,7 +1204,7 @@ va_start(ap, fmt); vsnprintf(descr, sizeof(descr), fmt, ap); va_end(ap); - return (intr_describe(isrc->xi_vector, isrc->xi_cookie, descr)); + return (intr_describe(&isrc->xi_intsrc, isrc->xi_cookie, descr)); } void @@ -1271,7 +1271,7 @@ if (isrc == NULL || isrc->xi_cookie != NULL) return (EINVAL); - error = intr_add_handler(name, isrc->xi_vector,filter, handler, arg, + error = intr_add_handler(name, &isrc->xi_intsrc, filter, handler, arg, flags|INTR_EXCL, &isrc->xi_cookie, 0); if (error != 0) printf("%s: %s: add handler failed: %d\n", name, __func__,