ARM64 linux kernel中local_irq_disable()、local_irq_enable()的原理

在armv8-arch64架构下,控制cpu是否响应IRQ,FIQ,SERROR,DEBUG中断,是由PSTATUS(daif寄存器)控制的。
在armv8-arch32或armv7架构下,控制cpu是否响应IRQ,FIQ,SERROR,DEBUG中断,CPSP中的 D A I F bit位控制的。

本文只讨论armv8-arch64架构下的linux kernel程序:

首先,local_irq_disable()、local_irq_enable()的实现就是写daif寄存器,与具体中断控制器无关,具体实现在irqflags.h中:
local_irq_disable() : disable当前cpu的IRQ
local_irq_enable() : enable当前cpu的IRQ
注意这里没有任何FIQ,SERROR,DEBUG bit的操作,操作的仅仅是IRQ的bit位。

ARM64 linux kernel中local_irq_disable()、local_irq_enable()的原理

另外搜索了整个linux kernel code,操作daif寄存器的地方只有两处,一处就是irqflags.h这里,另外一处就是建立页表的时候
临时disable了D A I F ,然后又恢复之前的值。

总结:在arm64 linux中,没有debug/serror/fiq的bit操作,local_irq_disable()、local_irq_enable()函数操作的也仅仅是IRQ bit位。
当然了,IRQ,DEBUG,SERROR是可以在linux kernel之前的阶段中enable/disable的。如在ATF中enable了SERROR。