1-保存環(huán)境
FIQ中斷觸發(fā)時(shí), PE將異常發(fā)生時(shí)的PSTATE保存到SPSR_EL3 , 將返回地址保存到ELR_EL3(以上是由硬件完成的) ,( pstate可能指CPU忙時(shí)的電源管理,也可能是其它的,但是肯定關(guān)于此時(shí)CPU狀態(tài)的。)然后跳轉(zhuǎn)到異常向量 表入口處執(zhí)行中斷處理流程 。
2-執(zhí)行中斷處理流程
fiq_aarch64函數(shù)主要由handle_interrupt_exception宏實(shí)現(xiàn),該宏的定義如下:
該函數(shù)主要實(shí)現(xiàn)了
- ? 1、 異常切換時(shí)的上下文保存 ,
- ? 2、運(yùn)行時(shí)棧的切換
- ? 3、 中斷處理函數(shù)查詢 、
- ? 4、參數(shù)設(shè)置和跳轉(zhuǎn)功能。
其詳細(xì)流程如下:
.macro handle_interrupt_exception label
bl save_gp_pmcr_pauth_regs (1)
(1)將通用寄存器(x0 – x29以及sp_el0),pmcr以及pauth寄存器保存到sp_el3指定的el3棧中
#if ENABLE_PAUTH
/* Load and program APIAKey firmware key */
bl pauth_load_bl31_apiakey
#endif
mrs x0, spsr_el3
mrs x1, elr_el3
stp x0, x1, [sp, #CTX_EL3STATE_OFFSET + CTX_SPSR_EL3] (2)
(2)將spsr_el3和elr_el3保存到sp_el3指定的el3棧中
/* Switch to the runtime stack i.e. SP_EL0 */
ldr x2, [sp, #CTX_EL3STATE_OFFSET + CTX_RUNTIME_SP] (3)
(3)從el3棧中讀取sp_el0棧指針
mov x20, sp (4)
(4)將sp_el3棧指針暫存到x20寄存器中
msr spsel, #MODE_SP_EL0 (5)
(5)將當(dāng)前的runtime棧切換為sp_el0
mov sp, x2 (6)
(6)恢復(fù)sp_el0棧的值
bl plat_ic_get_pending_interrupt_type (7)
(7)讀取當(dāng)前中斷的中斷號,并根據(jù)中斷號獲取中斷類型
cmp x0, #INTR_TYPE_INVAL
b.eq interrupt_exit_label (8)
(8)若中斷類型為非法,則直接退出中斷處理
bl get_interrupt_type_handler (9)
(9)獲取該中斷類型對應(yīng)的處理函數(shù)
cbz x0, interrupt_exit_label (10)
(10)若獲取處理函數(shù)失敗,則直接退出中斷處理
mov x21, x0 (11)
(11)將中斷類型處理函數(shù)指針暫存到x21寄存器中
mov x0, #INTR_ID_UNAVAILABLE
/* Set the current security state in the 'flags' parameter */
mrs x2, scr_el3
ubfx x1, x2, #0, #1 (12)
(12)設(shè)置中斷處理函數(shù)的輸入?yún)?shù)0和參數(shù)1
/* Restore the reference to the 'handle' i.e. SP_EL3 */
mov x2, x20 (13)
(13)將sp_el3指針設(shè)置中斷處理函數(shù)的輸入?yún)?shù)2
/* x3 will point to a cookie (not used now) */
mov x3, xzr (14)
(14)設(shè)置中斷處理函數(shù)的輸入?yún)?shù)3,該參數(shù)始終當(dāng)前為0
/* Call the interrupt type handler */
blr x21 (15)
(15)跳轉(zhuǎn)到中斷處理函數(shù)并執(zhí)行實(shí)際的中斷處理
interrupt_exit_label:
/* Return from exception, possibly in a different security state */
b el3_exit
.endm
(1)將通用寄存器(x0 – x29以及sp_el0),pmcr以及pauth寄存器保存到sp_el3指定的el3棧中
(2)將spsr_el3和elr_el3保存到sp_el3指定的el3棧中
(3)從el3棧中讀取sp_el0棧指針
(4)將sp_el3棧指針暫存到x20寄存器中
(5)將當(dāng)前的runtime棧切換為sp_el0
(6)恢復(fù)sp_el0棧的值
(7)讀取當(dāng)前中斷的中斷號,并根據(jù)中斷號獲取中斷類型
(8)若中斷類型為非法,則直接退出中斷處理
(9)獲取該中斷類型對應(yīng)的處理函數(shù)
(10)若獲取處理函數(shù)失敗,則直接退出中斷處理
(11)將中斷類型處理函數(shù)指針暫存到x21寄存器中
(12)設(shè)置中斷處理函數(shù)的輸入?yún)?shù)0和參數(shù)1
(13)將sp_el3指針設(shè)置中斷處理函數(shù)的輸入?yún)?shù)2
(14)設(shè)置中斷處理函數(shù)的輸入?yún)?shù)3,該參數(shù)始終當(dāng)前為0
(15)跳轉(zhuǎn)到中斷處理函數(shù)并執(zhí)行實(shí)際的中斷處理
在bl31中實(shí)際的中斷處理函數(shù)有兩類,group 0中斷和secure group 1中斷。 group 0中斷由exception handler framework(ehf)管理,該框架實(shí)現(xiàn)了對bl31中g(shù)roup 0中斷的注冊和管理 ,當(dāng)前sdei框架使用了這種中斷類型。
而secure EL1中斷一般是bl31為bl32接收并轉(zhuǎn)發(fā)給bl32的 ,如optee在bl31中注冊了一個(gè)secure el1中斷處理函數(shù)opteed_sel1_interrupt_handler,該函數(shù)比較簡單,只是執(zhí)行了異常等級上下文切換,跳轉(zhuǎn)到bl32的fiq異常處理入口,將中斷處理轉(zhuǎn)交給bl32。
-
cpu
+關(guān)注
關(guān)注
68文章
10917瀏覽量
213159 -
中斷
+關(guān)注
關(guān)注
5文章
900瀏覽量
41799 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4349瀏覽量
63024
發(fā)布評論請先 登錄
相關(guān)推薦
ARM中斷模式(IRQ)和快速中斷模式(FIQ)區(qū)別比較
fx3和fiq為什么會中斷?
ARM異常中斷處理流程分析
FIQ比IRQ快的原因
中斷處理函數(shù)(IRQHandler)的標(biāo)準(zhǔn)流程
MPC860 的中斷處理技術(shù)研究
ARM微處理器編程模型之異常中斷處理分析
一種支持多個(gè)FIQ的向量中斷控制器設(shè)計(jì)
![一種支持多個(gè)<b class='flag-5'>FIQ</b>的向量<b class='flag-5'>中斷</b>控制器設(shè)計(jì)](https://file.elecfans.com/web1/M00/45/10/o4YBAFpgYEiAGFNOAACEJQK8Ae8021.jpg)
一文讀懂LPC中的中斷處理
ARM中斷向量表與響應(yīng)流程的系列資料詳細(xì)說明
![ARM<b class='flag-5'>中斷</b>向量表與響應(yīng)<b class='flag-5'>流程</b>的系列資料詳細(xì)<b class='flag-5'>說明</b>](https://file.elecfans.com/web1/M00/9A/81/pIYBAF0ewAmAJND5AAGFs0-rEEc756.png)
ARM7的定時(shí)器中斷和外部中斷與串口中斷的原理詳細(xì)說明
![ARM7的定時(shí)器<b class='flag-5'>中斷</b>和外部<b class='flag-5'>中斷</b>與串口<b class='flag-5'>中斷</b>的原理詳細(xì)<b class='flag-5'>說明</b>](https://file.elecfans.com/web1/M00/A8/C8/pIYBAF2N1uaAMbRWAADNA8XXmek329.png)
控制IRQ和FIQ中斷的編譯器內(nèi)部函數(shù) 基于Keil MDK
痞子衡嵌入式:以i.MXRT1xxx的GPIO模塊為例談?wù)?b class='flag-5'>中斷處理函數(shù)(IRQHandler)的標(biāo)準(zhǔn)流程...
![痞子衡嵌入式:以i.MXRT1xxx的GPIO模塊<b class='flag-5'>為</b><b class='flag-5'>例</b>談?wù)?b class='flag-5'>中斷</b><b class='flag-5'>處理</b>函數(shù)(IRQHandler)的標(biāo)準(zhǔn)<b class='flag-5'>流程</b>...](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
控制IRQ和FIQ中斷的編譯器內(nèi)部函數(shù) - 基于Keil MDK
![控制IRQ和<b class='flag-5'>FIQ</b><b class='flag-5'>中斷</b>的編譯器內(nèi)部函數(shù) - 基于Keil MDK](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Bl31中斷處理流程概述
![Bl31<b class='flag-5'>中斷</b><b class='flag-5'>處理</b><b class='flag-5'>流程</b>概述](https://file1.elecfans.com/web2/M00/AC/E2/wKgaomVKBaiAYlxYAAHpE1HlogE232.jpg)
評論