中断有四种状态:inactive,pending,active 和active and pending。而产生中断的方式有两种,一种是通过写pending寄存器,让中断进入pending状态,可以忽略是否真的有物理中断信号,让Distributor将该中断转发到对应CPU interface。
- 对于SGI中断,可以通过写入GICD_SGIR寄存器和GICD_SPENDSGIRn寄存器来产生。
- 对于外设中断,它可以通过硬件产生物理信号到GIC,也可以通过写入GICD_ISPENDRn寄存器来产生中断。
此外,ARM GIC在CPU interface中,为每个所支持的中断都维护了一个状态机,下图为该状态机的示意图以及转换关系:
当Distributor的中断转发功能以及CPU interface的中断信号发送功能使能,中断状态的转换如下:
A1和A2:转换/增加到pending状态
- 对于SGI中断,如果软件写入GICD_SGIR寄存器指定了目标处理器,或着目标寄存器的软件写入GICD_SPENDESGIRn寄存器的源处理器和中断ID等对应字段。
- 对于SPI和PPI中断,如果外设发出了中断信号,或者软件上写入了一个GICD_ISPENDR寄存器。
B1和B2:移除pending状态
- 对于SGI,会发生在对应目标处理器的软件写入寄存器GICD_CPENDSGIRn的对应bit
- 对于SPI和PPI,如果是电平敏感的中断,如果该中断的pending状态是由于输入的物理中断信号,当该信号被解除断言时,pending状态将会被移除。如果是边沿触发的中断,如果该中断是由于输入的物理边缘触发中断信号,或者是写入GICD_ISPENDRn寄存器造成的pending,如果可以通过写入GICD_ICPENDRn寄存器来解除pending状态。
C:从pending转到active
如果中断被使能,并且有足够的优先级,被CPU interface发送给处理器后,软件读取GICC_IAR寄存后,该中断将从pending状态转为active。
D:从pending状态转为active and pending:
- 对于SGI中断,如果写入寄存器来设置SGI的pending状态和读取GICC_IAR寄存器几乎发生在同时,或者当有两个或者更多的相同中断ID的SGI中断从同一个源处理器发送到同一个目标处理器时,如果其中一个SGI走 C 转换方式,则其余的SGI中断就走D转换方式。
- 对于PPI和SPI中断:如果当前中断被使能,软件读取GICC_IAR寄存器,这个读取动作将会添加active状态。此外,适用以下条件之一:-对于电平敏感中断,中断信号保持断言。通常是这样,因为在处理器在处理完中断之前,外围设备不会解除对中断的断言。对于一个边缘触发的中断,这种转换是否发生取决于GICC_IAR的读取的时间相对于检测中断的重新断言的时间。否则,GICC_IAR的读取将导致转换C,也可能是转换A2。
转换 E1和E2,移除中断状态
发生在软件通过写入r GICC_EOIR 和 GICC_DIR寄存器来使中断失活。
一种中断的持续时间取决于它被配置为电平敏感还是边沿敏感:
对于电平敏感,中断输入的上升沿会导致中断被pending,并且这个中断会被一直hold直到外设将这个中断信号拉低
对于边沿敏感,中断输入的上升沿会导致中断被pending,但是这个中断不会被hold