05-Exception Handling Framework
引流關(guān)鍵詞: 中斷、同步異常、異步異常、irq、fiq、BL1,BL2,BL3,BL31,BL32,BL33,AP_BL1,AP_BL2,AP_BL3,AP_BL31,AP_BL32,AP_BL33,SCP_BL1,SCP_BL2,BL0,BL30, optee、ATF、TF-A、Trustzone、optee3.14、MMU、VMSA、cache、TLB、arm、armv8、armv9、TEE、安全、內(nèi)存管理、頁表…
快速鏈接:
.
👉👉👉 個(gè)人博客筆記導(dǎo)讀目錄(全部) 👈👈👈
[專欄目錄]-ATF/FF-A/specification學(xué)習(xí)
術(shù)語
EHF : Exception Handling Framework
5.異常處理框架
本文檔描述了運(yùn)行時(shí)固件 (BL31) 針對(duì) EL3(而非 SMC)處理異常的framework。EHF將處理以下異常:
- 中斷
- 同步外部中止 (Synchronous External Aborts)
- 異步外部中止(Asynchronous External Aborts)
固件設(shè)計(jì)文檔中描述了TF-A對(duì)從較低 EL 引發(fā)的同步SMC異常。然而, EHF描述了除 SMC之外的中斷處理和同步異常的語義
通過將構(gòu)建選項(xiàng)設(shè)置為 來選擇EHF(EL3_EXCEPTION_HANDLING=1) ,并且僅適用于 AArch64 系統(tǒng)。
5.1 介紹
通過寄存器中的各種控制位SCR_EL3,Arm 架構(gòu)允許將異步異常路由到 EL3。如 中斷管理框架文檔中所述,根據(jù)所選的中斷路由模型,TF-A 適當(dāng)?shù)卦O(shè)置寄存器的FIQ和IRQ位 SCR_EL3以實(shí)現(xiàn)此路由。對(duì)于大多數(shù)用例,除了促進(jìn)正常和安全世界之間的上下文切換之外,路由到 EL3 的 FIQ 和 IRQ 不需要在 EL3 中處理。
然而,不斷發(fā)展的系統(tǒng)和標(biāo)準(zhǔn)環(huán)境要求在 EL3 中針對(duì)和處理各種異常。例如:
-
從 ARMv8.2 架構(gòu)擴(kuò)展開始,許多 RAS 特性被引入到 Arm 架構(gòu)中。實(shí)施 RAS 功能后,系統(tǒng)的各種組件可以使用其中一種異步異常來向 PE 發(fā)出錯(cuò)誤信號(hào)。這些錯(cuò)誤情況具有嚴(yán)重的性質(zhì),必須盡早采取糾正或補(bǔ)救措施。因此,通常遵循固件優(yōu)先處理方法來響應(yīng)系統(tǒng)中的 RAS 事件。
-
Arm SDEI 規(guī)范定義了 Normal world 與 Runtime Firmware 交互以請(qǐng)求系統(tǒng)事件通知的接口。SDEI規(guī)范要求通知這些事件,即使在正常世界執(zhí)行時(shí)屏蔽了異常。這也意味著需要固件優(yōu)先處理,其中事件首先由 EL3 固件接收,然后通過純軟件機(jī)制發(fā)送到普通世界。
對(duì)于TF-A,固件優(yōu)先處理意味著異步異常被適當(dāng)?shù)芈酚傻?EL3,并且運(yùn)行時(shí)固件 (BL31) 被擴(kuò)展為包括能夠處理以 EL3 為目標(biāo)的那些異常的軟件組件。這些組件(通常稱為調(diào)度程序 : dispatchers )可以選擇:
- 完全在 EL3 中接收和處理異常,這意味著異常處理在 EL3 中終止。
- 接收異常,但在 EL3 中處理部分異常,并將其余處理委托給在較低安全 EL 上運(yùn)行的專用軟件堆棧。在該方案中,處理跨越各種安全 EL。
- 接收異常,但在 EL3 中處理部分異常,并將錯(cuò)誤的處理委托給在較低安全 EL 上運(yùn)行的專用軟件堆棧(如上);此外,普通世界也可能需要參與處理,或被通知此類事件(例如,作為SDEI事件)。在此方案中,異常處理可能且最大程度地跨越安全和正常世界中的所有 EL。
在任何給定的系統(tǒng)上,所有上述處理模型都可以獨(dú)立使用,具體取決于平臺(tái)選擇和接收到的異常的性質(zhì)。
5.2. 異常處理框架的作用
作為上述用例的推論,EHF的主要作用是促進(jìn)固件優(yōu)先處理 Arm 系統(tǒng)上的異常。因此,EHF使運(yùn)行時(shí)固件中的多個(gè)異常分派器能夠共存、注冊(cè)和處理針對(duì) EL3 的異常。本節(jié)概述了基礎(chǔ)知識(shí),本文檔的其余部分?jǐn)U展了EHF的各個(gè)方面。
為了在調(diào)度程序之間仲裁異常處理,EHF操作基于優(yōu)先級(jí)方案。這種優(yōu)先級(jí)方案與 Arm GIC 架構(gòu)如何定義它密切相關(guān),盡管它也適用于非中斷異常(例如 SErrors)。
平臺(tái)需要將安全優(yōu)先級(jí)空間劃分為適用于安全軟件堆棧的優(yōu)先級(jí)。然后它將調(diào)度程序分配給一個(gè)或多個(gè)優(yōu)先級(jí)。然后調(diào)度程序在運(yùn)行時(shí)為優(yōu)先級(jí)注冊(cè)處理程序。調(diào)度程序可以為多個(gè)優(yōu)先級(jí)注冊(cè)處理程序。
當(dāng)處于該優(yōu)先級(jí)的處理程序當(dāng)前正在 EL3 中執(zhí)行或已將執(zhí)行委托給較低的 EL 時(shí),該優(yōu)先級(jí)處于活動(dòng)狀態(tài)。對(duì)于中斷,當(dāng)一個(gè)中斷在 EL3 被定位和確認(rèn)時(shí),這是隱含的,并且已確認(rèn)中斷的優(yōu)先級(jí)用于匹配其注冊(cè)的處理程序。當(dāng)中斷處理通過 EOI 中斷結(jié)束時(shí),優(yōu)先級(jí)同樣被隱式禁用。
非中斷異常(例如 SErrors)沒有優(yōu)先級(jí)的概念。為了使優(yōu)先級(jí)仲裁起作用,EHF提供了 API,以便這些非中斷異常具有優(yōu)先級(jí),并與中斷交互。因此,處理此類異常的調(diào)度程序必須在處理或委派它們時(shí)顯式激活和停用相應(yīng)的優(yōu)先級(jí)。
因?yàn)橹袛嗵幚淼膬?yōu)先級(jí)激活和停用是隱式的并且涉及 GIC 優(yōu)先級(jí)屏蔽,所以較低優(yōu)先級(jí)的中斷不可能搶占較高優(yōu)先級(jí)的中斷。通過擴(kuò)展,這意味著較低優(yōu)先級(jí)的調(diào)度程序不能搶占較高優(yōu)先級(jí)的調(diào)度程序。然而,非中斷異常的優(yōu)先級(jí)激活和停用必須是明確的。因此,EHF不允許在較高優(yōu)先級(jí)處于活動(dòng)狀態(tài)時(shí)激活較低優(yōu)先級(jí),并且會(huì)導(dǎo)致恐慌。同樣,如果在較高優(yōu)先級(jí)處于活動(dòng)狀態(tài)時(shí)嘗試停用較低優(yōu)先級(jí),則會(huì)導(dǎo)致恐慌。
本質(zhì)上,優(yōu)先級(jí)激活和停用在概念上就像一個(gè)堆棧——優(yōu)先級(jí)以嚴(yán)格遞增的方式堆疊,并且需要以嚴(yán)格的相反順序取消堆疊。對(duì)于中斷,GIC 確保是這種情況;對(duì)于非中斷,EHF監(jiān)控并斷言這一點(diǎn)。請(qǐng)參閱 優(yōu)先級(jí)轉(zhuǎn)換。
5.3. 中斷處理
EHF是中斷管理框架的客戶端,并為針對(duì) EL3 的中斷注冊(cè)頂級(jí)處理程序,如 中斷管理框架文檔中所述。這具有以下含義:
-
在 GICv3 系統(tǒng)上,當(dāng)在 S-EL1 中執(zhí)行時(shí),具有足夠優(yōu)先級(jí)的未決非安全中斷將作為 FIQ 發(fā)出信號(hào),因此將被路由到 EL3。因此,S-EL1 軟件不能期望在 S-EL1 處處理非安全中斷。本質(zhì)上,這不贊成描述為CSS=0, TEL3=0的路由模式。
-
為了讓 S-EL1 軟件在 啟用EHF時(shí)處理非安全中斷,調(diào)度程序必須采用一種模型,即在 EL3 接收非安全中斷,然后同步 處理到 S-EL1。
-
在 GICv2 系統(tǒng)上,需要將構(gòu)建選項(xiàng)GICV2_G0_FOR_EL3設(shè)置為,1以便Group 0中斷以 EL3 為目標(biāo)。
-
在安全世界中執(zhí)行時(shí),EHF將 GIC 優(yōu)先級(jí)掩碼寄存器設(shè)置為最低安全優(yōu)先級(jí)。這意味著沒有非安全中斷可以搶占安全執(zhí)行。有關(guān)更多詳細(xì)信息,請(qǐng)參閱對(duì) SMC 調(diào)用的影響。
如上所述,使用EHF時(shí),平臺(tái)需要將Group 0 中斷劃分為不同的優(yōu)先級(jí)。選擇接收中斷的調(diào)度程序然后可以擁有一個(gè)或多個(gè)優(yōu)先級(jí),并為它們注冊(cè)中斷處理程序。給定的優(yōu)先級(jí)只能分配給一個(gè)處理程序。調(diào)度程序可以注冊(cè)多個(gè)優(yōu)先級(jí)。
分派器分兩步分配中斷優(yōu)先級(jí):
5.3.1。分區(qū)優(yōu)先級(jí)
通過對(duì)中斷進(jìn)行分組和分配優(yōu)先級(jí)的方式,中斷與調(diào)度程序相關(guān)聯(lián)。換句話說,所有針對(duì)特定調(diào)度程序的中斷都應(yīng)該屬于特定的優(yōu)先級(jí)。對(duì)于優(yōu)先級(jí)分配:
-
Arm GIC 架構(gòu)允許的 8 位優(yōu)先級(jí)中,第 7 位必須為 0(安全空間)。
-
根據(jù)要支持的調(diào)度程序的數(shù)量,平臺(tái)必須選擇使用剩余 7 個(gè)位中的前n位來識(shí)別中斷并將其分配給各個(gè)調(diào)度程序。選擇n位最多支持 2 n 個(gè) 不同的調(diào)度程序。例如,通過選擇 2 個(gè)附加位(即位 6 和 5),平臺(tái)可以劃分為 4 個(gè)安全優(yōu)先級(jí)范圍:0x0、 0x20、0x40和0x60。請(qǐng)參閱中斷處理示例。
注意: Arm GIC 架構(gòu)要求支持兩種安全狀態(tài)的 GIC 實(shí)現(xiàn)必須實(shí)現(xiàn)至少 32 個(gè)優(yōu)先級(jí);即,8位中的至少5個(gè)高位是可寫的。In the scheme described above, when choosing n bits for priority range assignment, the platform must ensure that at least n+1top bits of GIC priority are writeable.
因此分配給中斷的優(yōu)先級(jí)也用于確定較低 EL 中委派執(zhí)行的優(yōu)先級(jí)。較低 EL 中的委托執(zhí)行與使用ehf_activate_priority()API 選擇的優(yōu)先級(jí)相關(guān)聯(lián)(稍后描述)。選擇的優(yōu)先級(jí)還決定了在較低 EL 中執(zhí)行時(shí)屏蔽的中斷,因此控制了委托執(zhí)行的搶占。
平臺(tái)通過聲明優(yōu)先級(jí)描述符數(shù)組來表達(dá)選擇的優(yōu)先級(jí)。數(shù)組中的每個(gè)條目都是類型 ehf_pri_desc_t,并聲明一個(gè)優(yōu)先級(jí),并應(yīng)由 EHF_PRI_DESC()宏填充。
注意:宏EHF_PRI_DESC()將描述符安裝在數(shù)組中的計(jì)算索引處,而不必將宏放置在數(shù)組中的位置。因此,數(shù)組的大小可能比它看起來的要大。因此ARRAY_SIZE()應(yīng)該使用宏來確定數(shù)組的大小。
最后,這個(gè)描述符數(shù)組通過 宏暴露給EHF 。EHF_REGISTER_PRIORITIES()
使用方法請(qǐng)參考中斷處理示例。另請(qǐng)參閱:中斷優(yōu)先級(jí)考慮。
5.3.2. 編程優(yōu)先級(jí)
分區(qū)優(yōu)先級(jí)中的文本僅描述了平臺(tái)如何表達(dá)所需的優(yōu)先級(jí)。然而,它不會(huì)選擇中斷,也不會(huì)在 GIC 中編程所需的優(yōu)先級(jí)。
固件設(shè)計(jì)指南解釋了配置安全中斷的方法。EHF要求平臺(tái)枚舉安全中斷的中斷屬性(而不僅僅是數(shù)量)。安全中斷的優(yōu)先級(jí)必須與上面分區(qū)優(yōu)先級(jí)部分中確定的相匹配 。
請(qǐng)參閱限制,另請(qǐng)參閱中斷處理示例以進(jìn)行說明。
5.4. 注冊(cè)處理程序
調(diào)度程序通過以下 API 為其優(yōu)先級(jí)注冊(cè)處理程序:
int ehf_register_priority_handler(int pri, ehf_handler_t handler)API 有兩個(gè)參數(shù):
-
注冊(cè)處理程序的優(yōu)先級(jí);
-
要注冊(cè)的處理程序。處理程序必須對(duì)齊到 4 個(gè)字節(jié)。
如果調(diào)度程序擁有多個(gè)優(yōu)先級(jí),它必須為每個(gè)優(yōu)先級(jí)調(diào)用 API。
API 將成功并返回0,僅在以下情況下:
-
存在具有請(qǐng)求的優(yōu)先級(jí)的描述符。
-
之前調(diào)用 API 時(shí)沒有注冊(cè)處理程序。
否則,API 返回-1.
中斷處理程序應(yīng)具有以下簽名:
typedef int (*ehf_handler_t)(uint32_t intr_raw, uint32_t flags, void *handle,void *cookie);這些參數(shù)是從頂級(jí)EL3 中斷處理程序中獲得的。
例如,SDEI 調(diào)度程序期望平臺(tái)分配兩個(gè)不同的優(yōu)先級(jí) - PLAT_SDEI_CRITICAL_PRI和PLAT_SDEI_NORMAL_PRI- 并注冊(cè)相同的處理程序來處理這兩個(gè)級(jí)別。
5.5. 中斷處理示例?
以下帶注釋的片段演示了平臺(tái)如何選擇將中斷分配給虛構(gòu)的調(diào)度程序:
#include <common/interrupt_props.h> #include <drivers/arm/gic_common.h> #include <exception_mgmt.h>.../** This platform uses 2 bits for interrupt association. In total, 3 upper* bits are in use.** 7 6 5 3 0* .-.-.-.----------.* |0|b|b| ..0.. |* '-'-'-'----------'*/ #define PLAT_PRI_BITS 2/* Priorities for individual dispatchers */ #define DISP0_PRIO 0x00 /* Not used */ #define DISP1_PRIO 0x20 #define DISP2_PRIO 0x40 #define DISP3_PRIO 0x60/* Install priority level descriptors for each dispatcher */ ehf_pri_desc_t plat_exceptions[] = {EHF_PRI_DESC(PLAT_PRI_BITS, DISP1_PRIO),EHF_PRI_DESC(PLAT_PRI_BITS, DISP2_PRIO),EHF_PRI_DESC(PLAT_PRI_BITS, DISP3_PRIO), };/* Expose priority descriptors to Exception Handling Framework */ EHF_REGISTER_PRIORITIES(plat_exceptions, ARRAY_SIZE(plat_exceptions),PLAT_PRI_BITS);.../* List interrupt properties for GIC driver. All interrupts target EL3 */ const interrupt_prop_t plat_interrupts[] = {/* Dispatcher 1 owns interrupts d1_0 and d1_1, so assigns priority DISP1_PRIO */INTR_PROP_DESC(d1_0, DISP1_PRIO, INTR_TYPE_EL3, GIC_INTR_CFG_LEVEL),INTR_PROP_DESC(d1_1, DISP1_PRIO, INTR_TYPE_EL3, GIC_INTR_CFG_LEVEL),/* Dispatcher 2 owns interrupts d2_0 and d2_1, so assigns priority DISP2_PRIO */INTR_PROP_DESC(d2_0, DISP2_PRIO, INTR_TYPE_EL3, GIC_INTR_CFG_LEVEL),INTR_PROP_DESC(d2_1, DISP2_PRIO, INTR_TYPE_EL3, GIC_INTR_CFG_LEVEL),/* Dispatcher 3 owns interrupts d3_0 and d3_1, so assigns priority DISP3_PRIO */INTR_PROP_DESC(d3_0, DISP3_PRIO, INTR_TYPE_EL3, GIC_INTR_CFG_LEVEL),INTR_PROP_DESC(d3_1, DISP3_PRIO, INTR_TYPE_EL3, GIC_INTR_CFG_LEVEL), };.../* Dispatcher 1 registers its handler */ ehf_register_priority_handler(DISP1_PRIO, disp1_handler);/* Dispatcher 2 registers its handler */ ehf_register_priority_handler(DISP2_PRIO, disp2_handler);/* Dispatcher 3 registers its handler */ ehf_register_priority_handler(DISP3_PRIO, disp3_handler);...另請(qǐng)參閱構(gòu)建時(shí)流程和運(yùn)行時(shí)流程。
5.6. 激活和停用優(yōu)先級(jí)
當(dāng)處理該優(yōu)先級(jí)的異常時(shí),該優(yōu)先級(jí)被認(rèn)為是活動(dòng)的:對(duì)于中斷,這在中斷被確認(rèn)時(shí)是隱含的;對(duì)于非中斷異常,例如 SErrors 或SDEI 顯式調(diào)度,這必須通過調(diào)用來完成ehf_activate_priority()。請(qǐng)參閱運(yùn)行時(shí)流程。
相反,當(dāng)調(diào)度程序已經(jīng)達(dá)到異常原因的邏輯解決方案時(shí),相應(yīng)的優(yōu)先級(jí)應(yīng)該被停用。如上,對(duì)于中斷,當(dāng)中斷為 GIC 中的 EOId 時(shí),這是隱含的;對(duì)于其他例外情況,這必須通過調(diào)用來完成 ehf_deactivate_priority()。
由于異常委派的不同規(guī)定,可能有不止一個(gè)工作流程用于停用:
-
調(diào)度程序已解決異常的原因,并決定不采取進(jìn)一步措施。在這種情況下,調(diào)度程序的處理程序在返回EHF之前停用優(yōu)先級(jí)。運(yùn)行時(shí)固件在通過 退出時(shí),會(huì)ERET在中斷發(fā)生之前恢復(fù)執(zhí)行。
-
SMC調(diào)度程序必須將執(zhí)行委托給較低的 EL,并且只有當(dāng)較低的 EL在未來的某個(gè)時(shí)間點(diǎn)返回完成(通過 an )信號(hào)時(shí),才能認(rèn)為異常的原因已解決。出現(xiàn)以下順序:
(1)、調(diào)度員調(diào)用setjmp()設(shè)置一個(gè)跳轉(zhuǎn)點(diǎn),并安排在下一個(gè) EL 時(shí)進(jìn)入較低的 EL ERET。
(2)、通過隨后ERET的運(yùn)行時(shí)固件,將執(zhí)行委托給較低的 EL。
(3)、較低的 EL 完成其執(zhí)行,并通過 SMC.
(4)、由SMC之前處理異常的同一調(diào)度程序處理。注意到異常處理的結(jié)束,調(diào)度程序確實(shí)longjmp()恢復(fù)到前一個(gè)跳轉(zhuǎn)點(diǎn)之外。
如上所述,EHF提供以下 API 用于激活和停用中斷:
-
ehf_activate_priority()激活提供的優(yōu)先級(jí),但前提是當(dāng)前活動(dòng)的優(yōu)先級(jí)高于給定的優(yōu)先級(jí);否則恐慌。此外,為了防止被較低優(yōu)先級(jí)的物理中斷中斷,EHF將對(duì)應(yīng)于 PE 的優(yōu)先級(jí)掩碼寄存器編程為被激活的優(yōu)先級(jí)。調(diào)度程序通常只需要在處理除中斷以外的異常時(shí)調(diào)用它,并且它需要將執(zhí)行委托給所需優(yōu)先級(jí)的較低 EL。
-
ehf_deactivate_priority()停用給定的優(yōu)先級(jí),但前提是當(dāng)前活動(dòng)的優(yōu)先級(jí)等于給定的優(yōu)先級(jí);否則恐慌。EHF 還將PE對(duì)應(yīng)的Priority Mask Registerehf_activate_priority()恢復(fù)到調(diào)用之前的優(yōu)先級(jí)。調(diào)度程序通常只需要在處理除中斷以外的異常后調(diào)用它。
API 的調(diào)用取決于允許的轉(zhuǎn)換。另請(qǐng)參見 運(yùn)行時(shí)流程。
5.7. 優(yōu)先級(jí)的轉(zhuǎn)換
可以調(diào)用EHF APIehf_activate_priority()來轉(zhuǎn)換 PE 上的當(dāng)前優(yōu)先級(jí)。ehf_deactivate_priority()對(duì)這些 API 的給定調(diào)用序列受以下條件的約束:
-
對(duì)于激活,EHF只允許增加優(yōu)先級(jí)(即數(shù)值減少);
-
對(duì)于停用,EHF只允許降低優(yōu)先級(jí)(即增加數(shù)值)。此外,被停用的優(yōu)先級(jí)必須是當(dāng)前優(yōu)先級(jí)。
如果違反這些,就會(huì)導(dǎo)致恐慌。
5.8. 對(duì) SMC 呼叫的影響
一般來說,安全執(zhí)行被認(rèn)為比非安全執(zhí)行更重要。正如本文檔其他地方所討論的,EL3 執(zhí)行以及之后的任何委派執(zhí)行都具有提高 GIC 優(yōu)先級(jí)掩碼的效果——無論是通過確認(rèn)安全中斷隱含地,還是在調(diào)度程序調(diào)用ehf_activate_priority(). 因此,非安全中斷不能搶占任何安全執(zhí)行。
來自非安全世界的 SMC 是同步異常,是非安全世界請(qǐng)求安全服務(wù)的機(jī)制。它們被廣泛歸類為 快速或屈服(參見SMCCC)。
-
從調(diào)用者的角度來看,快速SMC 是原子的。即,它們僅在安全世界完成服務(wù)請(qǐng)求時(shí)才返回給調(diào)用者。同時(shí)掛起的任何非安全中斷都不能搶占安全執(zhí)行。
-
Yielding SMC 帶有可搶占的、低優(yōu)先級(jí)請(qǐng)求的語義。掛起的非安全中斷可以搶占處理 Yielding SMC 的安全執(zhí)行。即,調(diào)用者可能會(huì)在以下任一情況下觀察到 Yielding SMC 返回:
(1)安全世界完成請(qǐng)求,調(diào)用者將找到SMC_OK 作為返回碼。
(2)非安全中斷搶占安全執(zhí)行。處理非安全中斷,并在SMC指令后恢復(fù)非安全執(zhí)行。 -
處理 Yielding SMC 的調(diào)度程序必須向非安全調(diào)用方提供不同的返回碼,以區(qū)分后一種情況。但是,此返回代碼不是標(biāo)準(zhǔn)化的(例如,與SMC_UNKNOWNor不同SMC_OK),因此會(huì)因處理請(qǐng)求的調(diào)度程序而異。
對(duì)于上面的后一種情況,EHF之前的調(diào)度程序期望將非安全中斷帶到 S-EL1 2,因此將有機(jī)會(huì)在屈服于非安全世界之前填充指定的搶占錯(cuò)誤代碼。
EHF的引入改變了中斷處理中描述的行為。
啟用EHF時(shí),為了允許非安全中斷搶占 Yielding SMC 處理,調(diào)度程序必須調(diào)用ehf_allow_ns_preemption() API。API 采用一個(gè)參數(shù),即在被搶占后返回到非安全世界的錯(cuò)誤代碼。
5.9. 構(gòu)建時(shí)流程
構(gòu)建時(shí)流程涉及以下步驟:
(1)平臺(tái)通過為各個(gè)調(diào)度程序安裝優(yōu)先級(jí)描述符來分配優(yōu)先級(jí),如分區(qū)優(yōu)先級(jí)中所述。
(2)平臺(tái)為 GIC 驅(qū)動(dòng)程序提供中斷屬性,如 編程優(yōu)先級(jí)中所述。
(3)調(diào)度程序調(diào)用ehf_register_priority_handler()以注冊(cè)中斷處理程序。
5.10。運(yùn)行時(shí)流
以下是中斷的示例流程:
(1)GIC 驅(qū)動(dòng)程序在初始化期間迭代平臺(tái)提供的中斷屬性(請(qǐng)參閱編程優(yōu)先級(jí)),并配置中斷。這會(huì)對(duì)屬于不同調(diào)度程序的中斷編程適當(dāng)?shù)膬?yōu)先級(jí)和組(組 0)。
(2)EHF在其初始化過程中,向 EL3 中斷的中斷管理框架注冊(cè)一個(gè)頂級(jí)中斷處理程序。這也導(dǎo)致設(shè)置路由位SCR_EL3。
(3)當(dāng)屬于調(diào)度程序的中斷觸發(fā)時(shí),GIC 引發(fā) EL3/Group 0 中斷,并被帶到 EL3。
(4)執(zhí)行頂級(jí) EL3 中斷處理程序。處理程序確認(rèn)中斷,讀取其運(yùn)行優(yōu)先級(jí),并據(jù)此確定調(diào)度程序處理程序。
(5)EHF將PE 的優(yōu)先級(jí)屏蔽寄存器編程為接收到的中斷的優(yōu)先級(jí)。
(6)EHF將該優(yōu)先級(jí)標(biāo)記為active,并跳轉(zhuǎn)到調(diào)度程序處理程序。
(7)一旦調(diào)度程序處理程序完成其工作,它必須在返回EHF之前立即 停用優(yōu)先級(jí)。請(qǐng)參閱 停用工作流程。
以下是針對(duì)除中斷以外的 EL3 的異常的示例流程:
(1)該平臺(tái)為特定類型的異常提供處理程序。
(2)異常到來,相應(yīng)的處理程序被執(zhí)行。
(3)處理程序調(diào)用ehf_activate_priority()以激活所需的優(yōu)先級(jí)。這也具有提高 GIC 優(yōu)先級(jí)掩碼的效果,從而防止較低優(yōu)先級(jí)的中斷搶占處理。處理程序可以選擇完全在 EL3 中進(jìn)行處理或委托給較低的 EL。
(4)一旦異常處理結(jié)束,處理程序?qū)⒄{(diào)用 ehf_deactivate_priority()以停用先前激活的優(yōu)先級(jí)。這也具有將 GIC 優(yōu)先級(jí)掩碼降低到以前的效果。
5.11。中斷優(yōu)先級(jí)考慮
根據(jù)設(shè)計(jì),GIC 優(yōu)先級(jí)方案將安全中斷優(yōu)先于普通世界中斷。該平臺(tái)通過EHF進(jìn)一步在安全調(diào)度員之間分配相對(duì)優(yōu)先級(jí)。
如分區(qū)優(yōu)先級(jí)中所述,針對(duì)不同調(diào)度程序的中斷屬于不同的優(yōu)先級(jí)。因?yàn)樗鼈兪峭ㄟ^ GIC 路由的,所以到 PE 的中斷傳遞受 GIC 優(yōu)先級(jí)規(guī)則的約束。特別是,當(dāng) PE 正在處理中斷時(shí)(即中斷處于活動(dòng)狀態(tài)),即使具有相同或較低優(yōu)先級(jí)的中斷未決,也只有較高優(yōu)先級(jí)的中斷會(huì)被發(fā)送到 PE。這會(huì)產(chǎn)生一個(gè)副作用,即一個(gè)調(diào)度程序由于另一個(gè)調(diào)度程序處理其(更高優(yōu)先級(jí))中斷而缺乏中斷。
EHF不強(qiáng)制執(zhí)行特定的優(yōu)先級(jí)策略,但平臺(tái)應(yīng)仔細(xì)考慮將優(yōu)先級(jí)分配給集成到運(yùn)行時(shí)固件中的調(diào)度程序。平臺(tái)應(yīng)根據(jù)不同調(diào)度員的性質(zhì),明智地為其劃分優(yōu)先級(jí)。特別是,關(guān)鍵性質(zhì)的調(diào)度程序(例如 RAS)應(yīng)該被分配比其他調(diào)度程序更高的優(yōu)先級(jí)(例如SDEI);在SDEI中,關(guān)鍵優(yōu)先級(jí) SDEI的優(yōu)先級(jí)應(yīng)高于正常優(yōu)先級(jí)。
5.12。限制
EHF具有以下限制:
-
盡管 GIC 優(yōu)先級(jí)方案最多可支持 128 個(gè)安全調(diào)度程序,但 EHF_REGISTER_PRIORITIES()當(dāng)前使用宏公開的描述符數(shù)組的大小限制為 32 個(gè)。這適用于大多數(shù)預(yù)期的用例。如果用例需要,這可能會(huì)在未來擴(kuò)展。
-
平臺(tái)必須確保異常描述符中分配給調(diào)度程序的優(yōu)先級(jí)與調(diào)度程序處理的中斷的編程優(yōu)先級(jí)匹配。EHF無法驗(yàn)證這是否已被遵循。
總結(jié)
以上是生活随笔為你收集整理的05-Exception Handling Framework的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 04-Debug FS
- 下一篇: 06-Firmware Configur