說明:
本文不考慮EL2,默認(rèn)NS-EL2、S-EL2都是disabled的
本文以Armv9-aarch64、Armv8-aarch64為基準(zhǔn),不討論aarch32的情況
中斷控制器以gicv3/gicv4為例,不討論其它中斷控制器和gicv2。
前置條件
我們先補(bǔ)充幾個(gè)概念:
(1)CPU有三種執(zhí)行環(huán)境(Runtime):
- CPU執(zhí)行在ATF
- CPU執(zhí)行在REE
- CPU執(zhí)行在TEE

(2)而對(duì)于中斷,有3種分類:
- NS-Group 1 :想給REE處理的中斷
- S-Group 1 :想給TEE處理的中斷
- Group 0:想給ATF處理的中斷
所以呢,就出現(xiàn)9種情況:
- (1)CPU執(zhí)行在REE時(shí),來了一個(gè)NS-Group 1中斷,想給REE處理的中斷
- (2)CPU執(zhí)行在ATF時(shí),來了一個(gè)NS-Group 1中斷,想給REE處理的中斷
- (3)CPU執(zhí)行在TEE時(shí),來了一個(gè)NS-Group 1中斷,想給REE處理的中斷
- (4)CPU執(zhí)行在TEE時(shí),來了一個(gè)S-Group 1中斷,想給TEE處理的中斷
- (5)CPU執(zhí)行在ATF時(shí),來了一個(gè)S-Group 1中斷,想給TEE處理的中斷
- (6)CPU執(zhí)行在REE時(shí),來了一個(gè)S-Group 1中斷,想給TEE處理的中斷
- (7)CPU執(zhí)行在ATF時(shí),來了一個(gè)Group 0中斷,想給ATF處理的中斷
- (8)CPU執(zhí)行在TEE時(shí),來了一個(gè)Group 0中斷,想給ATF處理的中斷
- (9)CPU執(zhí)行在REE時(shí),來了一個(gè)Group 0中斷,想給ATF處理的中斷
那么接下來,我們就開始分析,這9種情況,在整個(gè)多系統(tǒng)的軟硬件架構(gòu)中,是如何設(shè)計(jì)、如何處理的。
1、CPU執(zhí)行在REE時(shí),來了一個(gè)NS-Group 1中斷
CPU執(zhí)行在REE時(shí),來了一個(gè)NS-Group 1中斷,想給REE處理的中斷。
在REE執(zhí)行過程中,當(dāng)發(fā)生一個(gè)來自NS-Group 1的中斷時(shí),旨在傳遞給REE處理。鑒于當(dāng)前CPU處于非安全狀態(tài)且中斷類型為NS-Group 1,因此該中斷被標(biāo)記為IRQ。此時(shí),由于SCR_EL3.IRQ的值為0,所以此IRQ將會(huì)被路由至EL1。這一路由機(jī)制十分簡潔明了,直接將IRQ傳遞,使得CPU會(huì)進(jìn)入Linux Kernel的異常向量表中的irq向量,從而進(jìn)行處理。

2、CPU執(zhí)行在ATF時(shí),來了一個(gè)NS-Group 1中斷
CPU執(zhí)行在ATF時(shí),來了一個(gè)NS-Group 1中斷,想給REE處理的中斷。
透過事物看本質(zhì),我們可以理解這是一種想給REE處理的中斷,因此最終目標(biāo)是將CPU重新路由回REE,使其能夠正確處理此中斷。
接下來,我們將探討軟硬件設(shè)計(jì)問題。當(dāng)CPU處于ATF執(zhí)行狀態(tài)時(shí),PSTATE.I和PSTATE.F都被屏蔽(MASK),因此,此時(shí)CPU不會(huì)響應(yīng)任何中斷,所有產(chǎn)生的中斷都將保持在待處理狀態(tài)。只有在CPU從EL3切換回EL3以下狀態(tài)時(shí),且PSTATE.F/I解除屏蔽(unmasked)時(shí),待處理的中斷才會(huì)被taken。
考慮到CPU從EL3切換到EL3以下狀態(tài)有兩種路徑,因此,我們需要對(duì)此進(jìn)行分組討論:
- 當(dāng)CPU從EL3返回到REE端時(shí),情況等同于“CPU處于REE執(zhí)行狀態(tài),此時(shí)發(fā)生一個(gè)NS-Group 1中斷”,這會(huì)直接觸發(fā)將中斷傳遞到Linux內(nèi)核中的IRQ,使Linux內(nèi)核能夠繼續(xù)處理此中斷。
- 當(dāng)CPU從EL3返回到TEE端時(shí),情況等同于“CPU處于TEE執(zhí)行狀態(tài),此時(shí)發(fā)生一個(gè)NS-Group 1中斷”,這時(shí)將會(huì)重復(fù)執(zhí)行第3小節(jié)所述的中斷路由步驟。

3、CPU執(zhí)行在TEE時(shí),來了一個(gè)NS-Group 1中斷
CPU執(zhí)行在TEE時(shí),來了一個(gè)NS-Group 1中斷,想給REE處理的中斷。
透過事物看本質(zhì),我們可以理解這是一種想給REE處理的中斷。因此,你的軟硬件協(xié)同設(shè)計(jì)的最終目標(biāo)是將CPU拉回到REE,讓REE處理這個(gè)中斷。
我們接著關(guān)注軟硬件的設(shè)計(jì)。由于當(dāng)前CPU運(yùn)行在安全狀態(tài),中斷類型為NS-Group 1,因此中斷被標(biāo)記為FIQ。然而,考慮到此刻的SCR_EL3.IRQ=0,所以這個(gè)FIQ將會(huì)被路由至EL1。CPU進(jìn)入TEE OS的異常向量的FIQ向量,在fiq_handler的實(shí)現(xiàn)中,未讀取中斷IAR就調(diào)用了smc。這采用了一種主動(dòng)的軟件調(diào)用方式,將CPU切回了ATF。ATF察覺到這是一個(gè)中斷轉(zhuǎn)換過來的情況,因此繼續(xù)將CPU切換回REE。在此過程中,該中斷一直保持為掛起狀態(tài)。
當(dāng)CPU被重新引導(dǎo)回REE后,由于此時(shí)CPU運(yùn)行在非安全狀態(tài),中斷類型仍為NS-Group 1,所以該中斷被重新標(biāo)記為IRQ。隨之而來的是重新觸發(fā)中斷,該中斷被target至EL1,與下圖中的步驟4對(duì)應(yīng)。在中斷處理完成后,依次將CPU拉回TEE,使其回到被打斷的位置。

4、CPU執(zhí)行在TEE時(shí),來了一個(gè)S-Group 1中斷
CPU執(zhí)行在TEE時(shí),來了一個(gè)S-Group 1中斷,想給TEE處理的中斷。
由于當(dāng)前CPU運(yùn)行在Secure Security State、中斷類型為S-Group 1中斷,所以該中斷被標(biāo)記為IRQ,由于此時(shí)SCR_EL3.IRQ=0,所以該中斷被標(biāo)記為IRQ,并被target到EL1。所以這種路由很干脆直接,將直接產(chǎn)生IRQ,讓CPU進(jìn)入TEE OS的異常向量表的irq向量去處理。

5、CPU執(zhí)行在ATF時(shí),來了一個(gè)S-Group 1中斷
CPU執(zhí)行在ATF時(shí),來了一個(gè)S-Group 1中斷,想給TEE處理的中斷。
我們透過事物看本質(zhì),這是想給TEE處理的中斷,所以最終的結(jié)果,一定是要把CPU拉回到TEE,讓TEE去處理這個(gè)中斷。
接下來我們討論軟硬件設(shè)計(jì),CPU執(zhí)行在ATF的時(shí)候,此時(shí)PSTATE.I和PSTATE.F都是MASK的,所以此時(shí)不會(huì)taken任何中斷,一切產(chǎn)生的中斷將處于pending狀態(tài)。當(dāng)CPU從EL3切回EL3以下的時(shí)候,PSTATE.F/I unmasked的時(shí)候,此時(shí)pending的中斷才會(huì)被taken。由于CPU從EL3切換EL3以下有兩條路徑,所以我們需要分組討論一下:
- 當(dāng)CPU從EL3往REE側(cè)返回后,此時(shí)條件等同于“CPU執(zhí)行在REE時(shí),來了一個(gè)S-Group 1中斷”,此時(shí)會(huì)將第6小節(jié)的中斷路由步驟全部再走一遍。
- 當(dāng)CPU從EL3往TEE側(cè)返回后,此時(shí)條件等同于“CPU執(zhí)行在TEE時(shí),來了一個(gè)S-Group 1中斷”,也就是將直接產(chǎn)生target到TEE O中的irq,讓TEE繼續(xù)處理這個(gè)中斷。

6、CPU執(zhí)行在REE時(shí),來了一個(gè)S-Group 1中斷
CPU執(zhí)行在REE時(shí),來了一個(gè)S-Group 1中斷,想給TEE處理的中斷.
我們透過事物看本質(zhì),這是想給TEE處理的中斷,所以最終的結(jié)果,你的軟硬件協(xié)同的設(shè)計(jì),一定是要把CPU拉回到TEE,讓TEE去處理這個(gè)中斷。
我們?cè)賮砜窜浻布脑O(shè)計(jì),由于當(dāng)前CPU運(yùn)行在Non Secure Security State、中斷類型為S-Group 1中斷,所以該中斷被標(biāo)記為FIQ,由于此時(shí)SCR_EL3.IRQ=1,所以該FIQ將被target到EL3。CPU 進(jìn)入 ATF的異常向量的FIQ向量,在ATF的fiq_handler實(shí)現(xiàn)中,它會(huì)繼續(xù)進(jìn)行中斷轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)到TEE OS中特定的入口(這里與TEE OS廠商的設(shè)計(jì)相關(guān),不同廠商有不同的實(shí)現(xiàn)),進(jìn)入TEE OS后,真正處理這個(gè)中斷,處理完畢后,再依次返回。

7、CPU執(zhí)行在ATF時(shí),來了一個(gè)Group 0中斷
CPU執(zhí)行在ATF時(shí),來了一個(gè)Group 0中斷,想給ATF處理的中斷。
CPU執(zhí)行在ATF的時(shí)候,此時(shí)PSTATE.I和PSTATE.F都是MASK的,所以此時(shí)不會(huì)taken任何中斷,一切產(chǎn)生的中斷將處于pending狀態(tài)。當(dāng)cpu從EL3切回EL3以下的時(shí)候,PSTATE.F/I unmasked的時(shí)候,此時(shí)pending的中斷才會(huì)被take。由于CPU從EL3切換EL3以下有兩條路徑,所以我們需要分組討論一下:
- 當(dāng)CPU從EL3往REE側(cè)返回后,此時(shí)條件等同于“CPU執(zhí)行在REE時(shí),來了一個(gè)Group 0中斷”,此時(shí)會(huì)將第9小節(jié)的中斷路由步驟全部再走一遍。
- 當(dāng)CPU從EL3往TEE側(cè)返回后,此時(shí)條件等同于“CPU執(zhí)行在TEE時(shí),來了一個(gè)Group 0中斷”,此時(shí)會(huì)將第8小節(jié)的中斷路由步驟全部再走一遍。

8、CPU執(zhí)行在TEE時(shí),來了一個(gè)Group 0中斷
CPU執(zhí)行在TEE時(shí),來了一個(gè)Group 0中斷,想給ATF處理的中斷.
此時(shí)根據(jù)中斷類型為Group 0,該中斷將被標(biāo)記為FIQ,根據(jù)SCR_EL3.FIQ=0,該fiq將直接被target到EL1,在tee中的fiq_handler中,將采取軟件主動(dòng)方式將CPU切回ATF,進(jìn)入ATF后,該中斷仍不會(huì)被taken,因?yàn)榇藭r(shí)PSTATE.I/R都是masked的。直至CPU再返回REE端的時(shí)候,將重新產(chǎn)生target到EL3的FIQ,那時(shí)中斷才會(huì)被處理。

9、CPU執(zhí)行在REE時(shí),來了一個(gè)Group 0中斷
CPU執(zhí)行在REE時(shí),來了一個(gè)Group 0中斷,想給ATF處理的中斷。
由于是Group0中斷,中斷將被標(biāo)記為FIQ,又由于SCR_EL3.FIQ=1,F(xiàn)IQ將被直接target到EL3,進(jìn)入ATF的異常向量表的fiq向量進(jìn)行處理。

-
SCR
+關(guān)注
關(guān)注
2文章
153瀏覽量
45963 -
ARM處理器
+關(guān)注
關(guān)注
6文章
361瀏覽量
43133 -
中斷處理
+關(guān)注
關(guān)注
0文章
94瀏覽量
11420 -
LINUX內(nèi)核
+關(guān)注
關(guān)注
1文章
318瀏覽量
23063 -
中斷控制器
+關(guān)注
關(guān)注
0文章
62瀏覽量
9774
發(fā)布評(píng)論請(qǐng)先 登錄
Aurix的DMA硬件請(qǐng)求源自于中斷路由模塊,請(qǐng)問是否支持一個(gè)外設(shè)請(qǐng)求(中斷)對(duì)應(yīng)多個(gè)DMA通道?
[求助]如何判斷路由器電源適配器的進(jìn)出接線?
請(qǐng)教一下汽車can總線路由表中的信號(hào)路由、報(bào)文路由和診斷路由中各個(gè)參數(shù)的設(shè)置要求規(guī)則?
中斷系統(tǒng)的外部中斷示例
PCI中斷機(jī)制分析
基于半監(jiān)督學(xué)習(xí)的多示例多標(biāo)簽改進(jìn)算法
單片機(jī)學(xué)習(xí)##中斷系統(tǒng)(2)--外部中斷示例
AURIX系列之TC275學(xué)習(xí)筆記(五):中斷系統(tǒng)
電動(dòng)機(jī)運(yùn)行中斷路器跳閘檢查項(xiàng)目總結(jié)
診斷路由功能及測(cè)試方案介紹

多系統(tǒng)中斷路由的9種示例
評(píng)論