AArch64 異常
Synchronous
Asynchronous
- IRQ
- FIQ
- SError
Synchronous exceptions include
- Service call: SVCs, SMCs and HVCs(covered later)
- Aborts from MMU
- SP and PC alignment checking
- Unallocated instructions
SError exceptions include
Asynchronous data abrots
Taking an exception
when an exception occurs:
- SPSR_ELn updated
- PSTATE updated (EL stays the same OR gets higher)
- Return address stared to ELR_ELn
- ESR_ELn updated with cause of exception
- Branches to the exception table
To return from an exception execute ERET instruction
- Restores PSTATE from SPSR_ELn
- Restores PC from ELR_ELn
ARM從ARMv8開始支持64位架構,當前的ARMv8只有A系列,ARMv8-A架構。
新增一套arm64位指令集稱爲A64,之前的32位arm指令集稱爲A32, thumb指令集稱爲T32。
定義AArch64/AArch32兩套運行環境(稱作Execution state)分別執行64/32位指令集。
A64和A32指令集的每個指令都是固定4字節的。
ARMv8的異常與以前的架構做了較大改動,以前的ARM,處理器可以處在多種工作模式(process mode),如 User,FIQ, IRQ, Abort, Undefined,System等,每個模式都是由1/2中相應的中斷觸發的。實際上粗略分只是兩種特權模式(User屬於非特權模式,其他的都是特權模式)。
在ARMv8中User,FIQ, IRQ, Abort, Undefined,System這些模式統統取消,被EL0,EL1,EL2,EL3四種特權特權模式取代(跟之前的特權模式/非特權模式相比,實際上特權級還是增加了的)。與x86的ring0-ring3剛好相反,在這四種模式中EL0是最低權限,一般給用戶態程序用的。EL1稍高,一般給內核用的。EL2/EL3分別是Hypervisor(虛擬化相關)和secure monitor(安全相關)的模式,一般linux中是可以不用的。
因爲需要兼容ARMv7,所以User,FIQ, IRQ, Abort, Undefined,System這些中斷模式還是需要支持的,在ARMv8中就全部直接映射到EL1模式了(TODO: 應該是有個寄存器記錄當前具體哪個模式)。
ARMv8異常模式如下圖(摘自[1])。
不同EL級別之間的轉換規則:
- EL轉換隻會發生在 異常發生 或者 異常返回 的時候。
- 異常發生時EL級別只能提升或不變。
- 異常返回時EL級別只能降低或不變。
- EL轉換的目標級別稱爲”目標異常級別”,只能由異常自身特徵,或配置系統控制寄存器決定。
- 目標異常級別不能使EL0。
- 不同的EL級別有些寄存器是不同的,如圖(摘自[2])。
Execution state的變化
- AArch64提供31個(x0 - x30)64-bit的通用寄存器 提供64位的pc/lr/sp
- A32/T32的切換通過BX即可,但A32/A64的切換必須通過異常。
- EL0,EL1,EL2,El3之前的切換,分別通過指令svc,hvc,smc。
- 若下層系統爲32bit(如EL1),則上層只能爲32bit(如EL0),反之若下層位64bits,則上層可以爲32/64bits。