1. 前言
2.可配置的指令使能/禁用控制和trap控制
- 指令使能/禁用
當指令被禁用,則這條指令就會變成未定義
- 指令Trap控制
控制某條或某些指令在運行時進入陷阱,進入陷阱的指令會產生trap異常,路由規則如下:
(1)當前為EL1,則陷阱異常傳遞給EL1(HCR_EL2.TGE定義為1時,會路由到EL2);
(2)當前為EL2,則陷阱異常傳遞給EL2;
(3)當前為EL3,則陷阱異常傳遞給EL3;
3. 系統調用
- SVC
默認情況下SVC產生supervisor call,同步異常目標級別為EL1,使得運行EL0的軟件可以調用EL1下的操作系統或軟件的接口
- HVC
如果實現了EL2,默認情況下HVC產生hypervisor call,同步異常目標級別為EL2
注:HVC指令在EL0和secure EL1沒有定義
- SMC
如果實現了EL3,默認情況下SMC產生Secure monitor Call,同步異常目標級別為EL3
注:SMC指令在EL0未定義
注:
1.此處說的默認情況需滿足如下兩個條件:
(1)系統調用指令的運行等級低於或等於目標異常級別;
(2)系統調用指令沒有被trap控制到其他異常級別???
2. 如果運行HVC和SVC的異常級別高於目標異常級別,會引發異常,並被傳遞給當前異常級別;
3. EL3和EL2可以禁用HVC系統調用;
4. EL2可通過trap(配置陷阱異常)的方式調用SMC;
5. EL3可以禁用SMC
4. 低功耗模式機制
- Send Event指令
(1)SEV指令,在多處理器系統中,event會被發送給所有的PE;
(2)SEVL指令,設置本地event Register;
注:
(1)建議SEV前加DSB保證內存訪問完成;
(2)SEVL與WFE在同個PE執行,不需要加屏障
所有的異常級別都可以執行SEV和SEVL指令;
- Event Register
Event register對應每個PE都有一個bit,如果置位說明有一個事件發生,PE要請求某些行為。有如下事件均可導致event register置位:
(1)執行SEV指令;
(2)當前PE執行SEVL指令;
(3)異常返回;
(4)global monitor中關於本PE的標記位被清除;
(5)來自於generic timer event stream的事件;
(6)發送自定義事件
- Wait for Event(WFE)
PE可以通過使用WFE指令進入低功耗狀態,依賴Event register的值,如果接收到WFE wake-up event,會離開低功耗狀態。利用WFE指令可以減少spin lock機制的功耗; |
|
WFE指令 |
|
WFE wake-up event in AArch64 |
注:並不是如上所有事件都會設置event register |
- Wait for Interrupt(WFI)
WFI |
軟件可以通過使用WFI命令讓PE進入低功耗狀態。PE進入低功耗狀態后,如果接收到WFI wake-up event,會離開低功耗狀態 |
WFI wake-up event |
|
5. Self-hosted debug
- debugger
Self-hosted debug:PE自身擁有debugger調試器,debugger調試器通過編程讓PE產生debug異常
Externel debug:PE受外部debugger調試器的控制,debugger調試器通過編程讓PE產生debug事件,這樣可以讓PE進入debug狀態,在debug狀態,PE被halted
- Debug異常
Debug異常包括:
(1)Breakpoint Instruction exceptions
(2)Breakpoint exceptions.
(3)Watchpoint exceptions.
(4)Vector Catch exceptions.
(5) Software Step exceptions
要產生debug異常,需要滿足2個條件:
(1)使能Debug異常;
(2)當前的EL和secure state使能debug異常
- Debug mask bit
當目標異常級別是當前異常級別時PSTATE的D bit可以maskWatchpoint, Breakpoint, and Software Step exceptions
6. Performance Monitor Extension
PMU(Performance Monitor Unit)提供如下:
1. 一個64bit時鍾計數器
2.一個自定義數目的32bit事件計數器,每個事件計數器記錄某一事件的發生次數
7. Interprocessing
Interprocessing |
用來描述AArch32與AArch64運行狀態切換的術語 |
運行狀態切換時機 |
運行狀態只能在異常級別變化的時候才能進行切換,也即運行狀態只能發生在捕獲到異常時傳遞給高異常級別或從異常返回時返回到低異常級別 |
當捕獲一個異常並切換到更高的異常級別,運行狀態可以保持不變 或 32->64 |
|
當從一個異常返回切換到更低的異常級別,運行狀態可以保持不此案或 64->32 |
8. 自定義實現對編程模型的影響
- ARMv8三個自定義選項
(1)實現的異常級別的數目;
(2)哪些異常級別支持AArch32,哪些異常級別支持AArch64;
(3)SIMD和Float-point是否支持
- 異常級別實現暗含的內容
1. 所有實現必須包含EL0和EL1;
2. EL2和EL3是可選的
3. 可選的組合方式有:
(1)EL0、EL1和EL2,只支持non-secure state;
(2)EL0、EL1和EL3,只支持secure state;
(3)EL0、EL1,只能實現一種安全狀態,secure state或non-secure state;
(4)EL0、EL1、EL2、EL3均實現
- 異常級別、運行狀態、安全狀態的組合方式
實現的異常級別 |
secure state |
EL3 |
EL2 |
EL1 |
EL0 |
EL0/EL1/EL2/EL3 |
Sec&non-sec |
AArch64/AArch32 |
AArch64/AArch32 |
AArch64/AArch32 |
AArch64/AArch32 |
AArch64 |
AArch64 |
AArch64/AArch32 |
AArch64/AArch32 |
||
AArch64 |
AArch64 |
AArch64 |
AArch64/AArch32 |
||
AArch64 |
AArch64 |
AArch64 |
AArch64 |
||
AArch32 |
AArch32 |
AArch32 |
AArch32 |
||
EL0/EL1 /EL3 |
Sec&non-sec |
AArch64 |
\ |
AArch64/AArch32 |
AArch64/AArch32 |
AArch64 |
\ |
AArch64 |
AArch64/AArch32 |
||
AArch64 |
\ |
AArch64 |
AArch64 |
||
AArch32 |
\ |
AArch32 |
AArch32 |
||
EL0/EL1/EL2 |
Non-sec only |
\ |
AArch64 |
AArch64/AArch32 |
AArch64/AArch32 |
\ |
AArch64 |
AArch64 |
AArch64 |
||
EL0/EL1 |
Sec or non-sec |
\ |
\ |
AArch64 |
AArch64/AArch32 |
\ |
\ |
AArch64 |
AArch64 |
||
\ |
\ |
AArch32 |
AArch32 |
- 五類經典組合圖示(EL0/EL1/EL2/EL3都實現)
- 如果沒有實現全部4個異常級別的影響
(1)中斷不會路由到這些異常級別;
(2)沒有異常通過陷阱進入這些異常級別;
(3)所有從低異常級別通過系統調用切換到未實現的異常級別被作為未定義處理;
(4)不支持從未實現異常級別做地址轉換
(5)任何要通過異常返回到未實現的異常級別被視為非法的異常返回
(6)任何和未實現異常級別相關的寄存器都被視為RES0(具有切換到低異常級別功能的相關寄存器除外)
9.參考文檔
[1] DDI0487A_k_armv8_arm_iss10775.pdf