High level irq event handler
综述
当外设触发一次中断后,一个大概的处理过程是:
1)具体CPU architecture相关的模块会进行现场保护,然后调用machine driver对应的中断处理handler
2)machine driver对应的中断处理handler中会根据硬件的信息获取hwirq,并且通过irq domain模块翻译成virq
3)调用该virq 获取对应中断描述数组,并获取对应的handle_irq,在这个high level的handler中,会通过和interupt controller交互,进行中断处理的flow control,当然最终会遍历该中断描述符的action list,调用外设的specific handler来处理该中断
4)具体CPU architecture相关的模块会进行现场恢复。
本章节着重描述 handle_irq 的处理过程;
irq_desc->handle_irq 流程
5.2.1 底层汇编调用C函数接口,从以上底层代码可窥见其流程,
其实,直接从CPU的中断处理跳转到通用中断处理模块是不可能的,中断处理不可能越过interrupt controller这个层次。一般而言,通用中断处理模块会提供一些通用的中断代码处理库,然后由interrupt controller这个层次的代码调用这些通用中断处理的完成整个的中断处理过程。“interrupt controller这个层次的代码”是和硬件中断系统设计相关的。
5.2.2 C中的实现
从代码的逻辑上看,最终调用 handle_arch_irq = desc->handle_irq(desc); 也就是通过virq获取对应的irq_desc数组,并调用irq_desc->handle_irq 进行处理
具体处理如下所示: