2.3.3 el0_irq_naked与enable_da_f

Interrupt Pipeline系列文章大纲-CSDN博客

        2.3 el0_irq

                2.3.1 el0_irq代码框架
                2.3.2 kernel_entry 0 与kernel_exit 0
                2.3.3 el0_irq_naked与enable_da_f
                2.3.4 trace_hardirqs_off与trace_hardirqs_on
                2.3.5 irq_handler
                2.3.6 返回用户空间

2.3.3 el0_irq_naked与enable_da_f

      在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:

       enable_da_f

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博客

原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值