void intrdisable(int v, void (*f)(Ureg*, void*), void* a, int tbdf, char *name)
Almost invariably f is a function defined in a device driver to carry out the device-specific work associated with a given interrupt. The pointer a is passed to f; typically it points to the driver's data for a given device or controller. It also passes f a Ureg* value that contains the registers saved by the interrupt handler (the contents are platform specific; see the platform's include file ureg.h).
F is invoked by underlying code in the kernel that is invoked directly from the hardware vectors. It is therefore not running in any process (see kproc(10.2); indeed, on many platforms the current process pointer (up) will be nil. There are many restrictions on kernel functions running outside a process, but a fundamental one is that they must not sleep(10.2), although they often call wakeup to signal the occurrence of an event associated with the interrupt. Qio(10.2) and other manual pages note which functions are safe for f to call.
The interrupt controller driver does whatever is required to acknowledge or dismiss the interrupt signal in the interrupt controller, before calling f, for edge-triggered interrupts, and after calling f for level-triggered ones. F is responsible for deal with the cause of the interrupt in the device, including any acknowledgement required in the device, before it returns.
Intrdisable removes any registration previously made by intrenable with matching parameters, and if no other interrupt is active on v, it masks the interrupt in the controller. Device drivers that are not dynamically configured tend to call intrenable during reset or initialisation (see dev(10.2)), but can call it at any appropriate time, and instead of calling intrdisable they can simply enable or disable interrupts in the device as required.
|INTRENABLE(10.2 )||Rev: Tue Mar 31 02:42:39 GMT 2015|