ラズベリーパイ3のメモ(ARMv8の実行状態,例外レベルとか)

実行状態 Execution state

・2種類の実行状態がある.

AArch32 state 32ビット汎用レジスタにアクセスできる
A32およびT32命令セットのみを使用できる
AArch64 state 64ビット汎用レジスタにアクセスできる
A64命令セットのみを使用できる

・(AArch32 stateにはさらに,A32 stateとT32 stateがあるが省略)

例外レベル Exception Level

・以下の表のように,4種類の例外レベルがある

例外レベル 一般的な使用用途
EL0 アプリケーション
EL1 OSカーネル
EL2 ハイパーバイザ
EL3 セキュアモニタ

・例外レベルが上がるに従い,アクセスできるシステムレジスタが増える

実行状態の変更方法

・AArch32およびAArch64状態の切り替えは、例外の境界でのみ発生する
・より高い例外レベルへリターンしたときに,AArch32⇒AArch64に変更できる
(例)
EL0レベルで例外が発生しEL1レベルにリターンしたときに,AArch32⇒AArch64に変更できる
・より低い例外レベルへリターンしたときに,AArch64⇒AArch32に変更できる
(例)
EL3レベルで例外が発生しEL2レベルにリターンしたときに,AArch64⇒AArch32に変更できる

スタックポインタレジスタ Stack Pointer register

・以下の表のように,各例外レベルに個別のスタックポインタがある

例外レベル SPレジスタの名前(64bit)
EL0 SP_EL0
EL1 SP_EL1
EL2 SP_EL2
EL3 SP_EL3

・2通りのSPレジスタの選択方法(なぜ2通りあるのか?)

EL0t EL0レベルでSP_EL0を使用
EL1t EL1レベルでSP_EL0を使用
EL2t EL2レベルでSP_EL0を使用
EL3t EL3レベルでSP_EL0を使用
EL0h なし
EL1h SP_EL1を使用
EL2h SP_EL2を使用
EL3h SP_EL3を使用

例外ベクタテーブル

例外が発生した例外レベル Synchronous IRQ or vIRQ FIQ or vFIQ SError or vSError
現在の例外レベル(SP_EL0を使用したい) 0x000 0x080 0x100 0x180
現在の例外レベル(SP_ELxを使用したい) 0x200 0x280 0x300 0x380
? 0x400 0x480 0x500 0x580

?|0x600|0x680|0x700|0x780|