【ARMv8/v9 異常模型入門及漸進 8 -- 安全中斷介紹】【轉】

轉自:

https://blog.csdn.net/sinat_32960911/article/details/128254979

文章目錄
介紹
1.1 安全中斷簡介
1.1.1 GIC 配置
1.1.2 CPU的配置
1.2 FIQ 中斷觸發
1.2.1 Secure world and Normal world switch
上篇文章:ARMv8/v9 異常模型入門及漸進 7 – ARM64 linux irq_domain 介紹
下篇文章:ARMv8/v9 異常模型入門及漸進 9 – FIQ 和 IRQ 區別

介紹
Armv8一共有四個異常等級EL0、EL1、EL2和EL3,又有兩種security狀態,secure 和 nonsecure。同時在EL1以上的異常等級下,還可以使用兩個不同的棧指針SP_EL0和SP_ELx。在以上這些不同的執行狀態下,中斷都可能需要使用不同的處理方式,因此,中斷的處理流程就變的比較複雜。

1.1 安全中斷簡介
異常發生後系統將切換到具有更高執行權限的狀態,在 AArch64 是通過 exception level 來實現的。AArch64 最多支持 EL0~EL3 四個 exception level,EL0 的 execution privilege 最低,EL3 的 execution privilege 最高。當發生異常的時候,系統的 exception 會遷移(route)到更高的 exception level 或者維持不變,但是絕不會降低。此外,不會有任何的異常會去到 EL0。

AArch32,cpu 沒有異常等級,而是採用 processor mode 模式,例如 User、FIQ、IRQ、Abort、Undefined、System,這些不同的 mode 對應 privilege(其他mode)和 no-privilege(User mode)。

GICv3 中,引入了支持 2 種安全狀態(secure state),也就是對於中斷,根據secure 狀態,分爲 安全中斷和非安全中斷。當然也可以只支持一種安全狀態。

這裏的 2 種安全狀態和 1 種安全狀態,主要是影響:

中斷分組;
IRQ 和 FIQ 管腳的映射;
GIC中的寄存器訪問。
1.1.1 GIC 配置
GICv3 對 security 進行了擴展,可以將 GIC 配置爲工作在兩種 secure 狀態或 單一 secure 狀態。它可以通過配置寄存器GICD_CTRL.DS 實現:

GICD_CTRL.DS的值 支持的seure狀態 支持的group類型
0 secure和non secure兩種狀態 group0、secure group1、non secure group1
1 secure和non secure兩種狀態 group0、group1
從上表可以看到 GICv3 一共有三種中斷 Group,對於 SPI類型的中斷,可以通過寄存器 GICD_IGROUPR 和GICD_IGRPMOD 配置其中斷 Group。每種 Group 中斷都期望被下表特定的異常等級處理:

group 處理方式
group0 在EL3中處理
secure group1 在 secure EL1或secure EL2 中處理
non secure group 1 在 non secure EL1或non secure EL2 中處理
GICv3 可以觸發兩種中斷信號 irq 和 fiq,對中斷分組的目的就是使不同 Group 的中斷在不同狀態下可以被分別分發到 irq 或 fiq,在 aarch64 狀態下,中斷的分發方式如下:

從上表可知:

Group 0 中斷總是以 FIQ 方式觸發;
Secure Group 1 中斷根據 cpu 的當前執行狀態確定觸發方式:若當前執行狀態爲secure EL0 、EL1、EL2,以 irq 方式觸發。否則,以fiq方式觸發;
Non Secure Group 1 中斷,若當前執行狀態爲 non secure EL0、EL1、EL2,以 irq 方式觸發。否則,以 fiq 方式觸發 。
因此,GIC 對中斷路由的支持可以總結爲以下兩點:

在中斷配置時,根據中斷希望被處理的異常等級不同,將其配置爲三種不同的 Group;
在中斷被觸發時,GIC 根據中斷 Group 配置和當前的系統執行狀態,確定中斷是以 fiq 還是 irq 的方式觸發。
1.1.2 CPU的配置
使用 GICv3 後,中斷的傳遞和 GICv2 有所改變,GICv3 中將 cpu interface 從 GIC 中抽離放入到 cpu 中,

CPU Interface 通過 GIC Stream 接口與 GIC 進行通信;
當GIC要發送中斷,GIC 通過GIC Stream接口給 CPU Interface 發送中斷命令;
GIC 能做的只有中斷是以哪種方式(fiq 或 irq)觸發,若要達到不同 Group 中斷能被不同異常等級處理的目的,還需要 cpu的配合纔行。在 Armv8 中 SCR_EL3 寄存器是用於控制 Security 相關配置的,其各 bit 的定義如下圖:

其中 irq 和 fiq 用於配置中斷觸發時會被路由到 cpu 的哪個異常等級和 security 狀態,它們的定義如下:

(1)若將 FIQ 位配置爲 0,且當前執行狀態低於 EL3 時,則 FIQ 不會被路由到 EL3,而路由到第一個可以處理該中斷的異常等級 FEL
(2)若將 FIQ 配置爲 1,則運行於任何執行狀態時,FIQ 都會被路由到 EL3

而 irq 的配置方式與 fiq 類似。綜合上面分析,結合 gic 和 cpu 的配置,ARMv8 的中斷將有以下幾種路由方式:

Secure EL1 中斷

當前執行在 secure EL1,則觸發方式爲 irq,
由於 secure EL1 中斷需要在 secure EL1中處理,故只要將 scr.irq 設置爲0即可將它路由到 FEL;
當前執行在 non secure EL1,則觸發方式爲fiq,
同樣,由於它需要被 secure EL1處理,而 EL3 具有中斷轉發功能,因此可以將中斷先路由到 EL3,然後由 EL3 轉發給secure EL1。故可以將 scr.fiq 設置爲1;
當前執行在 EL3,則觸發方式爲 fiq,
此時,FIQ 需要被設置爲1,中斷被路由到 EL3,然後轉發給 secure EL1。
Non Secure EL1 中斷

當前執行在 secure EL1,則觸發方式爲 fiq,
由於中斷希望被 non secure EL1處理,因此中斷可以先路由到 EL3,然後轉發到 non secure EL1。因此 scr.fiq 設置爲 1;
當前執行在 non secure EL1,則觸發方式爲irq,   
此時,中斷被當前 EL 處理即可,故 scr.irq 需設置爲 0;
當前執行在 EL3,則觸發方式爲 fiq,  
此時,FIQ 需要被設置爲 1,中斷被路由到 EL3,然後轉發給 non secure EL1。
EL3 中斷

當前執行在 secure EL1,則觸發方式爲fiq     
將 scr.fiq 設置爲 1,以使中斷路由到 EL3
當前執行在 non secure EL1,則觸發方式爲 fiq,
將 scr.fiq設置爲 1,以使中斷路由到 EL3
當前執行在EL3,則觸發方式爲 fiq, 
將 scr.fiq設置爲 1,以使中斷路由到EL3
根據上面的幾種情況,即可知道異常等級切換時只要將 SCR.fiq 和 SCR.irq 值按下表設置,及可正確地配置中斷路由關係:

異常等級 scr.irq scr.fiq
secure EL1 0 1
non secure EL1 0 1
EL3 1 1
1.2 FIQ 中斷觸發
ARMv8 中除 EL0 以外,不同異常等擁有獨立的異常向量表,它們的基地址被分別保存在 VBAR_EL1、VBAR_EL2 和VBAR_EL3 寄存器中。由於 EL1 和 EL2 的 Secure 狀態和 Non Secure 狀態使用相同的寄存器,因此在進行 secure 狀態切換時,需要重新設置 VBAR_EL1 或 VBAR_EL2 寄存器的內容。這也是中斷能在各異常等級之間路由的基礎。

通常來說 FIQ 中斷產生後會跳轉到 VBAR_EL3+ 偏移地址 而手機廠商一般是將VBAR_EL3 的地址寫到 ATF 中,所以 FIQ 產生的中斷一般在 Linux kernel 中的中斷向量處找不到對應的處理函數。

一般來說 FIQ 產生後,不管是 ARMv-7 還是 ARMv-8 都會跳轉到 ATF 中進行處理。

在 ARMv-8 中當在 Normal World 中產生一個安全中斷後,首先會產生一個 FIQ 中斷,在 FIQ 中斷處理中段向量表中 只有一條 SMC 指令,所以先通過 SMC 指令切換到 Secure World,但是此時中斷還是 Pending 狀態,切換到 Secure World 之後,CPU Interface 在把中斷報給 core。

1.2.1 Secure world and Normal world switch
進入EL3 狀態之後,拉低 NS 線,系統執行 ERET 指令 進入 Secure OS。系統從 Secure OS 出來的時候也是先執行 SMC 進入 EL3 然後將 NS 線拉高,然後再 執行 ERET 進入到 Kernel OS。
————————————————
版權聲明:本文爲CSDN博主「CodingCos」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/sinat_32960911/article/details/128254979

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章