Major cleanup of the interrupt registration subsystem.
* Collapse the separate registrations in the kernel interrupt thread and
i386 layers into a single machine-independant kernel interrupt thread layer
in kern/kern_intr.c. Get rid of the i386 layer's 'MUX' code entirely.
* Have the interrupt vector assembly code (icu_vector.s and apic_vector.s)
call a machine-independant function in the kernel interrupt thread
layer to figure out how to process an interrupt.
* Move a lot of assembly into the new C interrupt processing function.
* Add support for INTR_MPSAFE. If a device driver registers an interrupt
as being MPSAFE, the Big Giant Lock will not be obtained or required.
* Temporarily just schedule the ithread if a FAST interrupt cannot be executed
due to its serializer being locked.
* Add LWKT serialization support for a non-blocking 'try' function.
* Get rid of ointhand2_t and adjust all old ISA code to use inthand2_t.
* Supply a frame pointer as a pointer rather then embedding it on th stack.
* Allow FAST and SLOW interrupts to be mixed on the same IRQ, though this
will not necessarily result in optimal operation.
* Remove direct APIC/ICU vector calls from the apic/icu vector assembly code.
Everything goes through the new routine in kern/kern_intr.c now.
* Add a new flag, INTR_NOPOLL. Interrupts registered with the flag will
not be polled by the upcoming emergency general interrupt polling
sysctl (e.g. ATA cannot be safely polled due to the way ATA register
access interferes with ATA DMA).
* Remove most of the distinction in the i386 assembly layers between FAST
and SLOW interrupts (part 1/2).
* Revamp the interrupt name array returned to userland to list multiple
drivers associated with the same IRQ.
48 files changed: