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

如何讓BL31的調(diào)試信息輸出到S32R45的uart?
BL31未在Kirkstone上加載的原因?
STM32的Cortex-M3中斷異常處理

STM32關(guān)全局中斷的方法 STM32中斷類型
51中斷系統(tǒng)與vhdl狀態(tài)機(jī)

ATF中bl2到bl31的跳轉(zhuǎn)介紹
ATF中bl31的啟動(dòng)

ATF中bl31函數(shù)介紹與使用
bl31中的psci架構(gòu)介紹

評(píng)論