fcd9e244be
The new code maintains two variables 'current_spl_level' and 'hardware_spl_level'. Variable hardware_spl_level reflects actual priority level at the hardware's point of view. hardware_spl_level is always synchronized to hardware. splraise() just increases current_spl_level. splx() sets current_spl_level. If (and only if) hardware_spl_level and current_spl_level is not same, splx() synchronizes interrupt mask register and hardware_spl_level to current_spl_level. In most case, splraise() raises current_spl_level and splx() restores only current_spl_level. When an interrupt occurs, hardware_spl_level and interrupt mask register are synchronized to current_spl_level. In this implementation, during a higher priority interrupt handler is running, lower priority interrupts never cause intr_dispatch() to run. It will avoid some race condition. |
||
---|---|---|
.. | ||
files.ixp12x0 | ||
ixp12x0_clk.c | ||
ixp12x0_clkreg.h | ||
ixp12x0_com.c | ||
ixp12x0_comreg.h | ||
ixp12x0_comvar.h | ||
ixp12x0_intr.c | ||
ixp12x0_intr.h | ||
ixp12x0_io.c | ||
ixp12x0_pci_dma.c | ||
ixp12x0_pci.c | ||
ixp12x0_pcireg.h | ||
ixp12x0.c | ||
ixp12x0reg.h | ||
ixp12x0var.h | ||
ixpsip.c | ||
ixpsipvar.h |