中斷處理需要軟件和硬件配合完成,GICv3根據中斷分組情況以及系統當前運行的異常等級確定中斷是以IRQ還是FIQ觸發。
CPU通過設置SCR_EL3.IRQ和SCR_EL3.FIQ確定IRQ和FIQ中斷分別是被路由到當前異常等級還是被路由到EL3。
若中斷被路由到EL3,根據異常發生時系統所處的異常等級,使用的棧指針是SP_EL0還是SP_ELx(x》
0),以及使用的aarch32還是aarch64架構,在每個異常等級下都包含了四張異常等級表。
bl31的異常向量表定義在runtime_exceptions.S中,其與下圖的定義一致。
但在ATF中只實現了后面兩種情形下的中斷處理函數,即若當前系統運行在EL3下,則不允許異常發生。為簡化討論,我們只關注aarch64的情形,則實際上bl31只實現了下圖中的第三種異常發生時中斷的處理。
這是因為除了系統啟動時以外,其它情況下系統運行在bl31則表示其本身是由低異常等級以smc指令進入的,此時系統本身就運行在異常上下文。
而系統返回所需要的elr_el3和spsr_el3都被保存在了sp_el3棧中。在bl31中sp_el3只用于保存寄存器等系統狀態信息,且所有的參數的存儲位置都是預定義好的。此時,若發生了irq或fiq中斷則中斷處理函數也會將它的elr_el3和spsr_el3保存到sp_el3中,從而導致smc調用的返回信息被覆蓋掉,從而使其無法返回。
因此bl31中的異常處理函數是非重入的,bl31運行時當前PE處于關中斷狀態。當然,對于smp系統,由于每個PE的sp_el3是獨立的,因此其它PE還是可以響應中斷的。
當系統運行在低異常等級時產生group 0中斷,則可以通過以上第三張異常向量表跳轉到bl31的aarch64異常處理函數,下面以FIQ為例說明其中斷處理流程。
-
硬件
+關注
關注
11文章
3349瀏覽量
66317 -
軟件
+關注
關注
69文章
4973瀏覽量
87758 -
中斷
+關注
關注
5文章
899瀏覽量
41567
發布評論請先 登錄
相關推薦
評論