1. arch/mips/kernel/genex.S
j plat_irq_dispatch
2. arch/mips/rt2880/irq.c
plat_irq_dispatch
rt2880_irqdispatch
do_IRQ
do_IRQ定义在 include/asm-mips/irq.h 这个头文件中,asm-mips这个目录链接到asm这里,所以在
arch/mips/rt2880/irq.c这个文件中 #include <asm/irq.h>
#define do_IRQ(irq) \
do { \
irq_enter(); \
__DO_IRQ_SMTC_HOOK(irq); \
generic_handle_irq(irq); \
irq_exit(); \
} while (0)
generic_handle_irq定义在 include/linux/irq.h 中,arch/mips/rt2880/irq.c这个文件中 #include <linux/hardirq.h>
在 include/linux/hardirq.h 中 #include <asm/hardirq.h> ,在 include/asm_mips/hardirq.h 中 #include <linux/irq.h>
至此, do_IRQ和 generic_handle_irq 都被包含进了arch/mips/rt2880/irq.c中了。
static inline void generic_handle_irq(unsigned int irq)
{
struct irq_desc *desc = irq_desc + irq;
#ifdef CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ
desc->handle_irq(irq, desc);
#else
if (likely(desc->handle_irq)){
desc->handle_irq(irq, desc);
}
else{
__do_IRQ(irq);
}
#endif
}
最终调用到了我们熟悉的desc->handle_irq