Interrupt Pipeline系列文章大纲-CSDN博客
在I-pipe中,没有对此处做修改。如果已经对二者比较熟悉,可以跳过本节剩余章节。
el0_irq_naked只有在el0_irq_compat中才调用。此时因为已经调用了kernel_entry 0,32进行了用户态现场保存,因此必须避免重复调用el0_irq中已经调用的kernel_entry 0,直接跳转到标签el0_irq_naked。
el0_irq_compat: kernel_entry 0, 32 b el0_irq_naked el0_irq: kernel_entry 0 el0_irq_naked: … ENDPROC(el0_irq) |
那el0_irq_naked和接下来调用的enable_da_f是否有关联呢?这个地方很容易误解是打开了中断嵌套。
当异常发生时,ARM64会自动把PSTATE寄存器里面的D、A、I、F标志位都设置为1,相当于把调试异常Debug、SError、IRQ及FIQ都关闭。除非软件清除上述中断标志位,否则在中断处理过程中,是不可能有嵌套中断被处理的。
enable_da_f由commit b282e1ce29 arm64: entry.S: convert elX_irq引入,在comments里面写明,在处理IRQ中断时,应该使能调试异常Debug和SError,同时顺便打开了FIQ。代码在arch/arm64/include/asm/assembler.h:
/* IRQ is the lowest priority flag, unconditionally unmask the rest. */ .macro enable_da_f msr daifclr, #(8 | 4 | 1) .endm |
因为Linux并不处理FIQ,且IRQ在此处没有使能,所以并不存在中断嵌套的情况。
点击查看系列文章 =》 Interrupt Pipeline系列文章大纲-CSDN博客
原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!