在内核中断初始化完成并且设备注册了响应的中断后,内核就可以响应相应的中断了。
首先要确定如果一个外设发出中断请求,它到底做了什么,设备是不能直接发出中断的,而是借助中断控制器,设备向中断控制器请求中断,这就是IRQ的来历。
对于龙芯1B处理器来说,中断控制器有四条输出线接在了处理器上,也就是四条中断线,INT0~INT3,每条中断线对应32个中断源,而中断控制器寄存器的位域也就跟这32个中断源一一对应。
每个设备控制器都有一条IRQ输出线和中断控制器寄存器的相应位相连,这样当相应设备控制器发出中断时,中断控制器寄存器相应位就置1,中断控制器就通过相应的中断输出线向内核发出中断,CP0协处理器寄存器cause寄存器的IP0~IP7相应位就置1。
内核响应中断就是跳转到事先设定好的异常向量入口,前面说过,对于龙芯1B内核是在0x80000180,首先读取cause寄存器中的例外码,确定是哪一种通用异常,然后跳转到exception_handler数组相应的处理函数中。对于中断就是数组的0号成员,处理函数是handler_int,执行handler_int,这个函数中是检查status寄存器的全局中断标志位IE是否置1,然后跳转到plat_irq_dispatch,这个函数就是中断的下发函数了,读取出status寄存器的IM0~IM7,读出cau