Changeset 356 for ssp_aarch64/trunk/arm64_gcc/prc_design.txt
- Timestamp:
- Jun 8, 2018, 11:24:32 AM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
ssp_aarch64/trunk/arm64_gcc/prc_design.txt
-
Property svn:mime-type
set to
text/plain; charset=utf-8
r353 r356 1 1 ===================================================================== 2 ARM64 ããã»ããµä¾åé¨è¨è¨ã¡ã¢2 ARM64プロセッサ依存部設計メモ 3 3 Last Modified: 5 Jun 2018 4 4 ===================================================================== 5 5 6 âãã®ããã¥ã¡ã³ãã®ä½ç½®ã¥ã 7 8 ãã®ããã¥ã¡ã³ãã¯ï¼TOPPERS/SSPã«ã¼ãã«ãARMv8-Aããã»ããµã«ç§»æ¤ããé 9 ã®è¨è¨ã¡ã¢ã§ããï¼ 10 11 12 âARMv8-Aã®ä»æ§ã¾ã¨ã 13 14 ARMv8-Aã®ä»æ§ã®ãã¡ï¼ã«ã¼ãã«ã®è¨è¨ã«é¢ä¿ããäºé 15 ã«ã¤ãã¦ã¾ã¨ããï¼ 16 17 âã¬ã¸ã¹ã¿ 18 19 æ±ç¨ã¬ã¸ã¹ã¿ã¯r0ãr30 (ç¹ã«64ãããã¬ã¸ã¹ã¿ã¯X0..X30ã§è¡¨ç¾)ã®31種é¡ãããªãï¼ 20 ï¼åèï¼ãProcedure Call Standard for the ARM 64-bit Architectureã 21 22 r0...r7 Parameter/result registers(å¼æ°ããã³è¿å¤ã®åã渡ãç¨) 23 r8 Indirect result location register (大ããªãã¼ã¿æ§é ã 24 è¿å¤ã¨ãã¦è¿ãå ´åãªã©ï¼å¼ã³åºãå´ãçµæãåãåºãããã« 25 éæ¥ã¢ãã¬ãã·ã³ã°ãå¤ç¨ããéï¼ãã®ãã¼ã¹ã¢ãã¬ã¹ãåã渡ã 26 ããããã«ä½¿ããã) 27 r9..r15 Caller-saved Temporary registers(å¼ã³åºãå´ã§ä¿åãã¹ãã¬ã¸ã¹ã¿) 6 ○このドキュメントの位置づけ 7 8 このドキュメントは,TOPPERS/SSPカーネルをARMv8-Aプロセッサに移植する際 9 の設計メモである. 10 11 12 ○ARMv8-Aの仕様まとめ 13 14 ARMv8-Aの仕様のうち,カーネルの設計に関係する事項についてまとめる. 15 16 ●レジスタ 17 18 汎用レジスタはr0〜r30 (特に64ビットレジスタはX0..X30で表現)の31種類からなる. 19 (参考)「Procedure Call Standard for the ARM 64-bit Architecture」 20 21 r0...r7 Parameter/result registers(引数および返値の受け渡し用) 22 r8 Indirect result location register (大きなデータ構造を 23 返値として返す場合など,呼び出し側が結果を取り出すために 24 間接アドレッシングを多用する際,そのベースアドレスを受け渡し 25 するために使われる) 26 r9..r15 Caller-saved Temporary registers(呼び出し側で保存すべきレジスタ) 28 27 r16(IP0) The first intra-procedure-call scratch register 29 ãªã³ã«ã«ãã£ã¦ veneer(注1) ããã³ PLT(Procedure Linkage Table,注2) ã³ã¼ã 30 ã®å¼ã³åºãã§ä½¿ãããï¼ãã以å¤ã®æã¯ãã³ãã©ãªã¬ã¸ã¹ã¿ã¨ãã¦ä½¿ããããã¨ãããï¼ 31 (注1)ãªã³ã«ã«ãã£ã¦æ¿å 32 ¥ãããå°ããªã³ã¼ãçã§ï¼ 33 åå²å½ä»¤ã®ã¿ã¼ã²ãããç¯å²å¤ã®å ´åãªã©ã«ä½¿ããã 34 (注2)å 35 ±æã©ã¤ãã©ãªã®å¼ã³åºãã§ã·ã³ãã«è§£æ±ºãè¡ãããã«ä½¿ç¨ããã 36 é¢æ°ãã¼ãã« 37 r17(IP1) The second intra-procedure-call temporary register(r16ã¨å½¹å²ã¯åã) 38 r18 The Platform Register(ãã©ãããã©ã¼ã ABIã§ä½¿ç¨ãããã¬ã¸ã¹ã¿ï¼ 39 ABIã§ä½¿ãããªãå ´åã¯ãã³ãã©ãªã¬ã¸ã¹ã¿ã¨ãã¦ä½¿ããã) 40 r19..r28 Callee-saved registers(å¼ã³åºãããå´ã§ä¿åãã¦ä½¿ãã¬ã¸ã¹ã¿) 41 r29(FP) The Frame Pointer(ãã¬ã¼ã ãã¤ã³ã¿) 42 r30(LR) The Link Register(ãªã³ã¯ã¬ã¸ã¹ã¿) 43 44 SSPã«ã¼ãã«ã®ã¢ã»ã³ãã©ã«ããå®è£ 45 ã§ã¯r8, r16...r18ã¯ä½¿ç¨ãã¦ããªãï¼ 46 47 48 âã³ã¼ãªã³ã°ã³ã³ãã³ã·ã§ã³ 49 50 r0...R7 ãå¼æ°ããã³è¿å¤ã«ä½¿ãããï¼ 51 ARMã«ããè¦å®ããã¦ããããï¼ã³ã³ãã¤ã©ã«ä¾åãããã®ã«ã¼ã«ã¨ãªã 52 53 âPSTATE 54 55 AArch64ã§ã¯ããã»ããµã®ç¶æ 56 ã表ããã©ã°ã®éã¾ããã¾ã¨ãã¦PSTATEã¨å¼ã³ï¼ 57 ããããã®ãã©ã°ã¸å¥ã 58 ã«ã¢ã¯ã»ã¹ããããã®ç¹å¥ãªã¬ã¸ã¹ã¿åãå®ç¾©ããã¦ããï¼ 59 60 PSTATEã®è©³ç´°ã¯ï¼ARM Architecture Reference Manual 61 ARMv8, for ARMv8-A architecture profile ã® D1.7 ãªã©ãåç 62 §ã®ãã¨ï¼ 63 64 ã»spsel 65 EL1ããä¸ã®ä¾å¤ã¬ãã«ã§ã¯ï¼spsel ã¨ããç¹å¥ãªå称ã®ã¬ã¸ã¹ã¿ã«ã¢ã¯ã»ã¹ãï¼ 66 PSTATE.SPãã©ã°ã®å¤ãã»ãããã¦ä½¿ç¨ã¹ã¿ãã¯ã®åãæ¿ããè¡ãï¼ 67 68 ã»daif 69 daif ã¨ããå称ã®ã¬ã¸ã¹ã¿ã使ç¨ãã¦PSTATEã®D,A,I,Fããããæä½ãï¼ 70 å種ä¾å¤ããã³å²è¾¼ã¿ã®ç¦æ¢/許å¯ãå¶å¾¡ãã 71 72 73 SSPã«ã¼ãã«ã®å®è£ 74 ã§ã¯ï¼ã¹ã¿ãã¯ã¯SP_EL1ã®ã¿ã使ç¨ããï¼ 75 ã¾ãï¼CPUããã¯ç¶æ 76 ããã³å²è¾¼ã¿ããã¯ç¶æ 77 ã®å®è£ 78 ã«PSTATEã®Iããã³Fãã©ã°ã 79 å©ç¨ãã¦ããï¼ 80 81 82 âå²è¾¼ã¿ãã¯ã¿ 83 84 ãã¯ã¿ãã¼ãã«ã®ã¢ãã¬ã¹ã¯ãªã»ããæã«ï¼ã·ã¹ãã ã¬ã¸ã¹ã¿ã®ä¸ã¤Vector Base 85 Address Register(VBAR, ã·ã¹ãã ã¬ã¸ã¹ã¿)ã«ã¢ãã¬ã¹ãã»ãããããã¨ã§ï¼ 86 2048ãã¤ãå¢çã®ä»»æã®ã¢ãã¬ã¹ã«é 87 ç½®å¯è½ã§ããï¼ 88 89 SSPã«ã¼ãã«ã®å®è£ 90 ã§ã¯ã¹ã¿ã¼ãã¢ããã«ã¼ãã³ã§è¨å®ãã¦ããï¼ 91 92 93 âå²è¾¼ã¿åªå 94 度 95 96 è¨å®å¤ã®å°ããæ¹ãé«åªå 97 度ã¨ãªãï¼ 98 99 åªå 100 度ã¯æ大8bitã§ããï¼SoCæ¯ã«å®è£ 101 ããã¦ãããããå¹ 102 ãç°ãªãï¼å®è£ 103 ã 104 ãããããã8bit以ä¸ã®å ´åã¯ï¼LSBããç¡å¹ã«ãªãï¼ä¾ãã°ï¼å®è£ 105 ããã¦ã 106 ããããå¹ 107 ã7bitã®å ´åã¯ï¼ããã0ãç¡å¹ã¨ãªãï¼ 108 109 åªå 110 度ã®ããããã£ã¼ã«ãã®LSBããæ°ãããããµãåªå 111 度ã¨å¼ã¶ãã£ã¼ã«ã 112 ã«è¨å®ãããã¨ãå¯è½ã§ããï¼æ®ãã®ä¸ä½ããããããªã¨ã³ãã·ã§ã³åªå 113 度㨠114 å¼ã¶ï¼ããªã¨ã³ãã·ã§ã³åªå 115 度ãåãã§ï¼ãµãåªå 116 度ãç°ãªãåªå 117 度ã®ã°ã«ã¼ 118 ãã¯ï¼ãäºããããªã¨ã³ãããããã¨ãã§ããªãï¼ 119 120 ä¾ã¨ãã¦ï¼QEMU Virtãã¼ãåãSSPã®å®è£ 121 ã§ã¯ Cortex-A53ããã»ããµã 122 ã¿ã¼ã²ããã¨ãã¦ããï¼åªå 123 度ã¯16段é(4bit)ã§ããã0ãã3ãç¡å¹ã§ããï¼ 124 125 âCPUã¢ã¼ã 126 127 ããã»ããµã¯ï¼EL0ããEL3ã¾ã§ã®ä¾å¤ã¬ãã«ã®ããããã§åä½ããï¼ 128 ã¾ãããããã®ã¬ãã«ã§64ãããã¢ã¼ã(AArch64) ã¾ãã¯32ãããã¢ã¼ã(AArch32)ã 129 é¸æãããã¨ãã§ããï¼ãã ãï¼ããä¾å¤ã¬ãã«ã32ãããã¢ã¼ãã§åä½ããå ´å㯠130 ããããä½ãä¾å¤ã¬ãã«ã§ã¯64ãããã¢ã¼ããé¸æãããã¨ãã§ããªãï¼ 131 132 ã¾ãï¼ã»ãã¥ãªãã£æ¡å¼µæ©è½ãæè¼ããããã»ããµã§ã¯ã»ãã¥ã¢ã¢ã¼ãããã³ 133 éã»ãã¥ã¢ã¢ã¼ããé¸æãããã¨ãã§ããï¼ 134 135 SSPã®å®è£ 136 ã§ã¯ï¼64ãããã¢ã¼ã(AArch64)ï¼éã»ãã¥ã¢ï¼ä¾å¤ã¬ãã«1(EL1) ã§åä½ããï¼ 137 138 139 âãªã»ããæã®ç¶æ 140 141 142 ãªã»ããæã¯ããã»ããµãããããµãã¼ãããæ大ã®ä¾å¤ã¬ãã«ããã³ãã®ã¬ãã«ã® 143 ã¹ã¿ãã¯(SP_ELx)ãæå¹ã¨ãªã£ã¦ããï¼ 144 145 ä¾ã¨ãã¦QEMUåãVirtãã¼ã(Cortex-A53) ã§ã¯ï¼æ¢å®ã§EL1ãæ大ä¾å¤ã¬ãã«ã®ãã 146 ãªã»ããç´å¾ã¯SP_EL1ãæå¹ã¨ãªã£ã¦ããï¼ 147 148 âå²è¾¼ã¿/ä¾å¤ã®åä» 149 150 å²è¾¼ã¿ãåãä»ããã¨åãä»ããå²è¾¼ã¿ã®çªå·ãï¼GICC_IARã«ã»ãããããï¼ 151 å²è¾¼ã¿çªå·ã¯ãã®ã¬ã¸ã¹ã¿ã«ã»ãããããå¤ã使ç¨ããï¼ 152 153 ä¾å¤çªå·ã¯ï¼ä¾å¤çºçæã®ããã»ããµç¶æ 154 ã«å¿ãã¦æ±ºå®ãããï¼ãã¯ã¿ãã¼ãã«ä¸ã® 155 ã¸ã£ã³ãå 156 ãªãã»ããæ¯ã«ç°ãªãçªå·ãå²ãæ¯ããã¨ã«ãã¦ããï¼ 157 158 ä¾å¤çºçæã®ç¶æ 159 ä¾å¤ã®ç¨®é¡ ä¾å¤çªå· ãä¾å¤ãã¯ã¿å 160 é ããã®ãªãã»ãã 28 リンカによって veneer(注1) および PLT(Procedure Linkage Table,注2) コード 29 の呼び出しで使われる.それ以外の時はテンポラリレジスタとして使われることもある. 30 (注1)リンカによって挿入される小さなコード片で, 31 分岐命令のターゲットが範囲外の場合などに使われる 32 (注2)共有ライブラリの呼び出しでシンボル解決を行うために使用される 33 関数テーブル 34 r17(IP1) The second intra-procedure-call temporary register(r16と役割は同じ) 35 r18 The Platform Register(プラットフォームABIで使用されるレジスタ. 36 ABIで使われない場合はテンポラリレジスタとして使われる) 37 r19..r28 Callee-saved registers(呼び出された側で保存して使うレジスタ) 38 r29(FP) The Frame Pointer(フレームポインタ) 39 r30(LR) The Link Register(リンクレジスタ) 40 41 SSPカーネルのアセンブラによる実装ではr8, r16...r18は使用していない. 42 43 44 ●コーリングコンベンション 45 46 r0...R7 が引数および返値に使われる. 47 ARMにより規定されているため,コンパイラに依存せずこのルールとなる 48 49 ●PSTATE 50 51 AArch64ではプロセッサの状態を表すフラグの集まりをまとめてPSTATEと呼び, 52 それぞれのフラグへ別々にアクセスするための特別なレジスタ名が定義されている. 53 54 PSTATEの詳細は,ARM Architecture Reference Manual 55 ARMv8, for ARMv8-A architecture profile の D1.7 などを参照のこと. 56 57 ・spsel 58 EL1より上の例外レベルでは,spsel という特別な名称のレジスタにアクセスし, 59 PSTATE.SPフラグの値をセットして使用スタックの切り替えを行う. 60 61 ・daif 62 daif という名称のレジスタを使用してPSTATEのD,A,I,Fビットを操作し, 63 各種例外および割込みの禁止/許可を制御する 64 65 66 SSPカーネルの実装では,スタックはSP_EL1のみを使用する. 67 また,CPUロック状態および割込みロック状態の実装にPSTATEのIおよびFフラグを 68 利用している. 69 70 71 ●割込みベクタ 72 73 ベクタテーブルのアドレスはリセット時に,システムレジスタの一つVector Base 74 Address Register(VBAR, システムレジスタ)にアドレスをセットすることで, 75 2048バイト境界の任意のアドレスに配置可能である. 76 77 SSPカーネルの実装ではスタートアップルーチンで設定している. 78 79 80 ●割込み優先度 81 82 設定値の小さい方が高優先度となる. 83 84 優先度は最大8bitであり,SoC毎に実装されているビット幅が異なる.実装さ 85 れるビットが8bit以下の場合は,LSBから無効になる.例えば,実装されてい 86 るビット幅が7bitの場合は,ビット0が無効となる. 87 88 優先度のビットフィールドのLSBから数ビットをサブ優先度と呼ぶフィールド 89 に設定することが可能である.残りの上位ビットをプリエンプション優先度と 90 呼ぶ.プリエンプション優先度が同じで,サブ優先度が異なる優先度のグルー 91 プは,お互いをプリエンプトすることができない. 92 93 例として,QEMU Virtボード向けSSPの実装では Cortex-A53プロセッサを 94 ターゲットとしており,優先度は16段階(4bit)でビット0から3が無効である. 95 96 ●CPUモード 97 98 プロセッサは,EL0からEL3までの例外レベルのいずれかで動作する. 99 またそれぞれのレベルで64ビットモード(AArch64) または32ビットモード(AArch32)を 100 選択することができる.ただし,ある例外レベルが32ビットモードで動作する場合は 101 それより低い例外レベルでは64ビットモードを選択することができない. 102 103 また,セキュリティ拡張機能を搭載するプロセッサではセキュアモードおよび 104 非セキュアモードを選択することができる. 105 106 SSPの実装では,64ビットモード(AArch64),非セキュア,例外レベル1(EL1) で動作する. 107 108 109 ●リセット時の状態 110 111 リセット時はプロセッサチップがサポートする最大の例外レベルおよびそのレベルの 112 スタック(SP_ELx)が有効となっている. 113 114 例としてQEMU向けVirtボード(Cortex-A53) では,既定でEL1が最大例外レベルのため 115 リセット直後はSP_EL1が有効となっている. 116 117 ●割込み/例外の受付 118 119 割込みを受け付けると受け付けた割込みの番号が,GICC_IARにセットされる. 120 割込み番号はこのレジスタにセットされる値を使用する. 121 122 例外番号は,例外発生時のプロセッサ状態に応じて決定される,ベクタテーブル中の 123 ジャンプ先オフセット毎に異なる番号を割り振ることにしている. 124 125 例外発生時の状態 例外の種類 例外番号 例外ベクタ先頭からのオフセット 161 126 AArch64, EL1t(EL1, SP_EL0) Synchronous 0 0x0000 162 127 AArch64, EL1t(EL1, SP_EL0) SError 1 0x0180 … … 168 133 AArch32, EL0 (EL0, SP_EL0) SError 7 0x0780 169 134 170 å²è¾¼ã¿ãåãä»ããéï¼åãä»ããå²è¾¼ã¿ã«è¨å®ãããåªå 171 度ããä½ãå²è¾¼ã¿ã 172 ç¦æ¢ããããï¼GICC_RPRããåå¾ããå²è¾¼ã¿è¦å ã®å²è¾¼ã¿åªå 173 度ã GICC_PMR㸠174 ã»ãããã¦ããï¼ããã¦ãã³ãã©çµäºå¾ã«å²è¾¼ã¿çºçåã®å²ãè¾¼ã¿åªå 175 度ã«æ»ãï¼ 176 177 â ã¹ã¿ãã¯ãã¤ã³ã¿ï¼SP_EL0ã¨SP_ELxï¼ 178 179 ã¹ã¿ãã¯ãã¤ã³ã¿ã¯ï¼ä¾å¤ã¬ãã«0ã®ã¹ã¿ãã¯ãã¤ã³ã¿(SP_EL0)ããã³å®è¡ä¸ã® 180 ä¾å¤ã¬ãã«ã®ã¹ã¿ãã¯ãã¤ã³ã¿(SP_ELx)ãé¸æå¯è½ã§ããï¼ 181 ã¹ã¿ãã¯ã®é¸æã¯spselã¬ã¸ã¹ã¿ã¸1ãè¨å®ããã¨SP_ELxãï¼0ãè¨å®ãã㨠182 SP_EL0 ãé¸æããï¼ 183 184 SSPã®å®è£ 185 ã§ã¯ï¼EL1 㧠SP_EL1 ã®ã¿ã使ç¨ãã¦åä½ããï¼ 186 187 âä¾å¤ã¬ãã«ã®é·ç§» 188 189 ä¾å¤ã¬ãã«(EL)ã®é·ç§»ã¯å²è¾¼ã¿/ä¾å¤ã®åä»ããã³ä¾å¤ãªã¿ã¼ã³å½ä»¤(eret)ã«ããè¡ãï¼ 190 191 å²è¾¼ã¿ããã³ä¾å¤ãåãä»ãããã¨ã§çºçåã¨åãã¾ãã¯ããé«ãä¾å¤ã¬ãã«ã¸é·ç§»ããï¼ 192 ä¸æ¹ï¼åãã¾ãã¯ããä½ãä¾å¤ã¬ãã«ã¸ã®é·ç§»ã¯ä¾å¤ãªã¿ã¼ã³å½ä»¤(eret)ã«ããè¡ãï¼ 193 194 åä»æã®é·ç§»å 195 ã¨ãªãä¾å¤ã¬ãã«ã®æå®ã¯ã·ã¹ãã ã¬ã¸ã¹ã¿ã«ããè¨å®ãããã¨ã§è¡ãï¼ 196 å²è¾¼ã¿/ä¾å¤ãªã¿ã¼ã³æã®é·ç§»å 197 ã¨ãªãä¾å¤ã¬ãã«ã¯ï¼SPSR_ELxã®ããã2ããã³3㧠198 æå®ããï¼å²è¾¼ã¿/ä¾å¤åä»æï¼PSTATEã®ç¶æ 199 ãSPSR_ELxã«ï¼ãªã¿ã¼ã³ã¢ãã¬ã¹ãELR_ELxã«ï¼ 200 ããããä¿åããeretå½ä»¤ã®å®è¡ã«ãããã®æ ¼ç´å¤ã復帰ãããããï¼eretå®è¡åã« 201 ãããããSPSR_ELxã«ã»ãããã¦ãããã¨ã§æå®ããä¾å¤ã¬ãã«ã¸é·ç§»ãããã¨ãå¯è½ã§ããï¼ 202 åãã¿ã¤ãã³ã°ã§ä½¿ç¨ã¹ã¿ãã¯ã64ããã/32ãããã¢ã¼ãã®æå®ãè¡ããã¨ãã§ããï¼ 203 204 QEMU VirtåãSSPã®å®è£ 205 ã§ã¯EL1ã®ã¿ã使ç¨ããããï¼ä¾å¤ã¬ãã«éã®é·ç§»å¦çã¯è¡ã£ã¦ããªãï¼ 206 207 âä¾å¤ã¬ãã«ã®å¤å® 208 209 ç¾ç¶ã®ä¾å¤ã¬ãã«ãå¤å®ããã«ã¯ï¼CPSRã®ããã2ããã³ããã3ã®å¤ã使ç¨ããï¼ 210 bit[3:2]ã®å¤ã 211 '11'ã®å ´åï¼EL3 212 '10'ã®å ´åï¼EL2 213 '01'ã®å ´åï¼EL1 214 '00'ã®å ´åï¼EL0 215 216 âGICC_PMRã¬ã¸ã¹ã¿ 217 218 è¨å®ããåªå 219 度以ä¸(å¤ã¨ãã¦ã¯ä»¥ä¸)ã®åªå 220 度ã®å²è¾¼ã¿ã®åä»ãç¦æ¢ããï¼ 221 è¨å®å¯è½ãªæ大å¤ãè¨å®ããã¨ï¼å 222 ¨ã¦ã®å²è¾¼ã¿ã許å¯ããï¼ 223 ä¾ãã°åªå 224 度ã16段éã®å ´åã¯0xf0(=0x0f << 4)ãã»ããããã¨ãã¹ã¦ã®å²è¾¼ã¿è¨±å¯ 225 ã¨ãªãï¼å¤ã¯ä¾å¤/å²è¾¼ã¿ã®åä»ã¨ãªã¿ã¼ã³ã«ããå¤åããªãããï¼åãä»ããå²è¾¼ã¿ 226 ã®åªå 227 度ãå²è¾¼ã¿ã®å 228 ¥å£å¦çã§è¨å®ããå¿ 229 è¦ãããï¼ 230 231 âä¾å¤/å²è¾¼ã¿ã®åä» 232 233 ã»ä¾å¤/å²è¾¼ã¿ãåä»ããã¨ï¼åä»ãæã«ã¢ã¯ãã£ããªã¹ã¿ãã¯ä¸ã«ä»¥ä¸ã®ã³ 234 ã³ããã¹ããä¿åããï¼ 135 割込みを受け付けた際,受け付けた割込みに設定された優先度より低い割込みを 136 禁止するため,GICC_RPRから取得した割込み要因の割込み優先度を GICC_PMRへ 137 セットしている.そしてハンドラ終了後に割込み発生前の割り込み優先度に戻す. 138 139 ● スタックポインタ(SP_EL0とSP_ELx) 140 141 スタックポインタは,例外レベル0のスタックポインタ(SP_EL0)および実行中の 142 例外レベルのスタックポインタ(SP_ELx)が選択可能である. 143 スタックの選択はspselレジスタへ1を設定するとSP_ELxを,0を設定すると 144 SP_EL0 を選択する. 145 146 SSPの実装では,EL1 で SP_EL1 のみを使用して動作する. 147 148 ●例外レベルの遷移 149 150 例外レベル(EL)の遷移は割込み/例外の受付および例外リターン命令(eret)により行う. 151 152 割込みおよび例外を受け付けることで発生前と同じまたはより高い例外レベルへ遷移する. 153 一方,同じまたはより低い例外レベルへの遷移は例外リターン命令(eret)により行う. 154 155 受付時の遷移先となる例外レベルの指定はシステムレジスタにより設定することで行う. 156 割込み/例外リターン時の遷移先となる例外レベルは,SPSR_ELxのビット2および3で 157 指定する.割込み/例外受付時,PSTATEの状態がSPSR_ELxに,リターンアドレスがELR_ELxに, 158 それぞれ保存されeret命令の実行によりその格納値が復帰されるため,eret実行前に 159 あらかじめSPSR_ELxにセットしておくことで指定した例外レベルへ遷移することが可能である. 160 同じタイミングで使用スタックや64ビット/32ビットモードの指定も行うことができる. 161 162 QEMU Virt向けSSPの実装ではEL1のみを使用するため,例外レベル間の遷移処理は行っていない. 163 164 ●例外レベルの判定 165 166 現状の例外レベルを判定するには,CPSRのビット2およびビット3の値を使用する. 167 bit[3:2]の値が 168 '11'の場合:EL3 169 '10'の場合:EL2 170 '01'の場合:EL1 171 '00'の場合:EL0 172 173 ●GICC_PMRレジスタ 174 175 設定した優先度以下(値としては以上)の優先度の割込みの受付を禁止する. 176 設定可能な最大値を設定すると,全ての割込みを許可する. 177 例えば優先度が16段階の場合は0xf0(=0x0f << 4)をセットするとすべての割込み許可 178 となる.値は例外/割込みの受付とリターンにより変化しないため,受け付けた割込み 179 の優先度を割込みの入口処理で設定する必要がある. 180 181 ●例外/割込みの受付 182 183 ・例外/割込みを受付けると,受付け時にアクティブなスタック上に以下のコ 184 ンテキストを保存する. 235 185 236 186 --------------- 237 187 | GICC_PMR | <- new SP 238 188 ---------------- 239 | å²è¾¼ã¿/ä¾å¤çªå·| 240 ---------------- 241 | ããã¼(0) | 242 ---------------- 243 | 調æ´é(0 or 8) | 244 ---------------- 245 |調æ´é å(å¿ 246 è¦æ)| (*)ã¢ã©ã¤ã¡ã³ã調æ´ãå¿ 247 è¦ãªã¨ãã®ã¿ 189 | 割込み/例外番号| 190 ---------------- 191 | ダミー(0) | 192 ---------------- 193 | 調整量(0 or 8) | 194 ---------------- 195 |調整領域(必要時)| (*)アライメント調整が必要なときのみ 248 196 ---------------- 249 197 | ESR_ELx | … … 257 205 | X29 | 258 206 ---------------- 259 | ï¼|260 | ï¼|207 | : | 208 | : | 261 209 ---------------- 262 210 | X1 | … … 267 215 268 216 269 å²è¾¼ã¿/ä¾å¤çºçæã®ä¸»ãªã·ã¼ã±ã³ã¹ã¯æ¬¡ã®ããã«ãªãï¼é·ç§»å 270 ã®ä¾å¤ã¬ãã«ãELxã¨è¡¨ç¾ããï¼ 271 272 ï¼ãã¼ãã¦ã§ã¢ã®å¦çï¼ 273 ã»PSTATEãSPSR_ELxã«ä¿åãã 274 ã»ãªã¿ã¼ã³ã¢ãã¬ã¹ãELR_ELxã«ä¿åãã 275 ã»PSTATE.{D,A,I,F}ã1ã«ã»ãããã 276 ã»åæä¾å¤ããã³SErrorå²è¾¼ã¿ã®ã¨ãï¼ä¾å¤è¦å æ 277 å ±ãESR_ELxã«ä¿åãã 278 ã»ã¹ã¿ãã¯ãã¤ã³ã¿ãSP_ELxã«åãæ¿ãã 279 ã»ELxã¸é·ç§»ãã 280 281 ï¼ã½ããã¦ã§ã¢ã§ã®å¦çï¼ 282 ã»(çºçæã«SP_EL0ã使ç¨ãã¦ããå ´å)ã¹ã¿ãã¯ãå²è¾¼ã¿çºçå(SP_EL0)ã«æ»ã 283 ã»æ±ç¨ã¬ã¸ã¹ã¿(X0-X30)ãã¹ã¿ãã¯ã«ä¿å 284 ã»SPSR_ELx, ESR_ELx, ELR_ELxãã¹ã¿ãã¯ã«ä¿å 285 ã»ã¹ã¿ãã¯ãã¤ã³ã¿ã®ã¢ã©ã¤ã¡ã³ããèª¿æ´ 286 ã»å²è¾¼ã¿çªå·(GICC_IARããåå¾)ï¼ä¾å¤çªå·(ãªãã»ããæ¯ã«å®ç¾©ããå¤)ãã¹ã¿ãã¯ã«ä¿å 287 ã»å²è¾¼ã¿çºçåã®å²è¾¼ã¿åªå 288 度ãã¹ã¯ãã¹ã¿ãã¯ã«ä¿å 289 ã»GICC_PMRã«åãä»ããå²è¾¼ã¿ã®å²è¾¼ã¿åªå 290 度ãã»ãã 291 ã»å²è¾¼ã¿/ä¾å¤ãã¹ãã«ã¦ã³ã¿ã®ã¤ã³ã¯ãªã¡ã³ã 292 ã»(å²è¾¼ã¿ã®å ´å)CPUããã¯è§£é¤ 293 ã»ãã¯ã¿ãã¼ãã«ãèªã¿è¾¼ã¿ãã³ãã©ãå®è¡ãã 294 295 âä¾å¤/å²è¾¼ã¿ããã®ãªã¿ã¼ã³ 296 297 ï¼ã½ããã¦ã§ã¢ã§ã®å¦çï¼ 298 ã»CPUããã¯ç¶æ 299 ã¸ç§»è¡ 300 ã»å²è¾¼ã¿/ä¾å¤ãã¹ã¨ã«ã¦ã³ã¿ã®ãã¯ãªã¡ã³ã 301 ã»GICC_PMRã«å²è¾¼ã¿çºçåã®åªå 302 度ãã¹ã¯ãæ»ã 303 ã»ã¹ã¿ãã¯ãã¤ã³ã¿ã®ã¢ã©ã¤ã¡ã³ã調æ´åãæ»ã 304 ã»æ»ãå 305 ã®ã³ã³ããã¹ããã·ã¹ãã ç¶æ 306 ã«å¿ãã¦å²è¾¼ã¿/ä¾å¤çºçå 307 ã¸ãªã¿ã¼ã³ 308 ã¾ãã¯é 309 延ãã£ã¹ããããå®è¡ãã 310 ã»ELR_ELxã«æ»ãå 311 ã¢ãã¬ã¹ï¼SPSR_ELxã«ããã»ããµç¶æ 312 ããããã 313 ã»ããããã¦ããç¶æ 314 ã§eretå½ä»¤ãå®è¡ãï¼å²è¾¼ã¿/ä¾å¤ãããªã¿ã¼ã³ 315 316 âã¹ã¿ãã¯ãã¤ã³ã¿ã®ã¢ã©ã¤ã¡ã³ãèª¿æ´ 317 318 AArch64ã§ã¯ï¼å¤é¨ã¤ã³ã¿ãã§ã¼ã¹ã«ããã¦ã¹ã¿ãã¯ãã¤ã³ã¿ã¯16ãã¤ãå¢çã« 319 ã¢ã©ã¤ã³ãããå¿ 320 è¦ãããï¼ãããä¾å¤çºçæã«ãããæºãããã¦ããã¨ã¯éããªãããï¼ 321 å²è¾¼ã¿/CPUä¾å¤ã®å 322 ¥å£å¦çã§ï¼ã¹ã¿ãã¯ãã¤ã³ã¿ãã¢ã©ã¤ã¡ã³ãæ¡ä»¶ãæºããã¦ããªãå ´åã«ã¯ï¼ 323 ã¹ã¿ãã¯ãã¤ã³ã¿ã調æ´ããï¼ã¾ãï¼åºå£å¦çã§ã¹ã¿ãã¯ãã¤ã³ã¿ãå 324 ã«æ»ããããã«ï¼èª¿æ´éãä¿åããï¼ 325 326 327 âOSã®å®è£ 328 329 330 1.ããã»ããµä¾åé¨å称: arm64 331 332 ARMv8 ã§ã¯ï¼64ãããã¢ã¼ã(AArch64)ããã³32ãããã¢ã¼ã(AArch32)ã®ä¸¡æ¹ããµãã¼ãããã 333 æ¬å®è£ 334 ã¯64ãããã¢ã¼ãã®ã¿ããµãã¼ããããã¨ãæ示ããããããã»ããµä¾åé¨å称ã arm64 ã¨ãã 335 336 2. ä¾å¤ã¢ã¼ãã®ä½¿ãåã 337 338 æ¬å®è£ 339 ã§ã¯ã¿ã¹ã¯ã³ã³ããã¹ãï¼éã¿ã¹ã¯ã³ã³ããã¹ãããããä¾å¤ã¬ãã«1(EL1)ã§åä½ããï¼ 340 ã¿ã¹ã¯ã³ã³ããã¹ããEL0ã§åä½ããæ¡ãèããããï¼ãã®å ´åã¯å²è¾¼ã¿/ä¾å¤ã®åºå£å¦çã«ãã㦠341 é 342 延ãã£ã¹ãããã®åã«ä¾å¤ã¬ãã«ã®åãæ¿ããå¿ 343 è¦ã¨ãªãï¼ 344 345 3.ãã£ã¹ãããã£ã®å®è¡ã¢ã¼ã 346 347 æ¬å®è£ 348 ã§ã¯ãã¹ã¦ä¾å¤ã¬ãã«1ã§åä½ããããï¼ãã£ã¹ãããã£ã¯ä¾å¤ã¬ãã«1(EL1)ã§åä½ããï¼ 349 350 351 4.ã¹ã¿ãã¯ã®ä½¿ãåã 352 353 SSPã§ã¯ã¿ã¹ã¯ã³ã³ããã¹ãï¼éã¿ã¹ã¯ã³ã³ããã¹ãå 354 ±ã«ä¸ã¤ã®ã¹ã¿ãã¯ãå 355 ±ç¨ããï¼ 356 æ¬å®è£ 357 ã§ã¯SP_ELxã使ç¨ãã¦ããï¼ 358 ãã®ä»ã«SP_EL0ã使ç¨ããå®è£ 359 ãèããããï¼ãã®å ´åã¯å²è¾¼ã¿/ä¾å¤ã®å 360 ¥å£å¦çã«ã¦ 361 ã¬ã¸ã¹ã¿ãä¿åããåã«SP_EL0ã¸ã®ã¹ã¿ãã¯åãæ¿ããè¡ãï¼ 362 363 5.ã³ã³ããã¹ãã®å¤å® 364 365 å²è¾¼ã¿/ä¾å¤ã®ãã¹ãåæ°ãä¿æããå¤æ°(intnest)ã0ãªãã¿ã¹ã¯ã¿ã¹ã¯ã³ã³ããã¹ãï¼ 366 1以ä¸ãªãéã¿ã¹ã¯ã³ã³ããã¹ãã¨ããï¼ 367 ã³ã³ããã¹ãæ¯ã«ä¾å¤ã¬ãã«ãåããå®è£ 368 ãåãå ´åã¯PSTATEã®ããã2ããã³3㧠369 ä¾å¤ã¬ãã«ãèªã¿åºããã¨ã«ããå¤å¥ããã¨ããæ¹æ³ãèããããï¼ 370 æ¬å®è£ 371 ã§ã¯ã³ã³ããã¹ãã«ãããåãä¾å¤ã¬ãã«ã使ç¨ãï¼ããã»ããµã® 372 ã¹ãã¼ã¿ã¹ã¬ã¸ã¹ã¿ã§ã¯å¤å¥ãã§ããªãããå¤æ°ã§å¤å¥ããï¼ 373 374 6. CPUãã㯠375 376 CPUããã¯PSTATE.Iããã³PSTATE.Fã«ããCPUããã¯ãå®ç¾ããï¼ 377 378 7. å²è¾¼ã¿ããã¯ã¨CPUä¾å¤ã®é¢ä¿ 379 380 ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ã¯ãµãã¼ãããªãããï¼å²è¾¼ã¿ããã¯ã¨CPUããã¯ããã¹ã¯ãã 381 å²è¾¼ã¿ã®ç¯å²ã¯åãã¨ããï¼ãã ãï¼ãã©ã°èªä½ã¯ãäºãã«ç¬ç«ãããããï¼ 382 å²è¾¼ã¿ããã¯ç¶æ 383 ã®è¨å®/解é¤ã®éã¯ï¼ããã¯åã«CPUããã¯ãã©ã°ã®ç¶æ 384 ãä¿åãï¼ 385 解é¤åã«å 386 ã®ç¶æ 387 ã«æ»ãããã«ãã¦ããï¼ 388 389 8. å¤é¨åªå 390 度ã¨å 391 é¨åªå 392 度 393 394 å¤é¨åªå 395 度ã¨ã¯APIã§æå®ããå²è¾¼ã¿åªå 396 度(PRIå)ã®ãã¨ã§ããï¼å¤ãå°ãã 397 ã»ã©åªå 398 度ãé«ãï¼å²è¾¼ã¿ãã³ãã©ã«ã¯ï¼-1ããé£ç¶ããè² ã®å¤ãè¨å®å¯è½ã§ 399 ããï¼å 400 é¨åªå 401 度ã¯ï¼GICC_PMRã¬ã¸ã¹ã¿ã«è¨å®ããå¤ã§ããï¼ 402 å¤é¨åªå 403 度ã¨å 404 é¨åªå 405 度ã®å¤æã¯ä»¥ä¸ã®ãã¯ãã§è¡¨ç¾ãããï¼ 406 407 /* å¤é¨è¡¨ç¾ã¸ã®å¤æ */ 217 割込み/例外発生時の主なシーケンスは次のようになる(遷移先の例外レベルをELxと表現する) 218 219 (ハードウェアの処理) 220 ・PSTATEをSPSR_ELxに保存する 221 ・リターンアドレスをELR_ELxに保存する 222 ・PSTATE.{D,A,I,F}を1にセットする 223 ・同期例外およびSError割込みのとき,例外要因情報をESR_ELxに保存する 224 ・スタックポインタをSP_ELxに切り替える 225 ・ELxへ遷移する 226 227 (ソフトウェアでの処理) 228 ・(発生時にSP_EL0を使用していた場合)スタックを割込み発生前(SP_EL0)に戻す 229 ・汎用レジスタ(X0-X30)をスタックに保存 230 ・SPSR_ELx, ESR_ELx, ELR_ELxをスタックに保存 231 ・スタックポインタのアライメントを調整 232 ・割込み番号(GICC_IARから取得),例外番号(オフセット毎に定義した値)をスタックに保存 233 ・割込み発生前の割込み優先度マスクをスタックに保存 234 ・GICC_PMRに受け付けた割込みの割込み優先度をセット 235 ・割込み/例外ネストカウンタのインクリメント 236 ・(割込みの場合)CPUロック解除 237 ・ベクタテーブルを読み込みハンドラを実行する 238 239 ●例外/割込みからのリターン 240 241 (ソフトウェアでの処理) 242 ・CPUロック状態へ移行 243 ・割込み/例外ネスとカウンタのデクリメント 244 ・GICC_PMRに割込み発生前の優先度マスクを戻す 245 ・スタックポインタのアライメント調整分を戻す 246 ・戻り先のコンテキストやシステム状態に応じて割込み/例外発生元へリターン 247 または遅延ディスパッチを実行する 248 ・ELR_ELxに戻り先アドレス,SPSR_ELxにプロセッサ状態がそれぞれ 249 セットされている状態でeret命令を実行し,割込み/例外からリターン 250 251 ●スタックポインタのアライメント調整 252 253 AArch64では,外部インタフェースにおいてスタックポインタは16バイト境界に 254 アラインさせる必要がある.しかし例外発生時にそれが満たされているとは限らないため, 255 割込み/CPU例外の入口処理で,スタックポインタがアライメント条件を満たしていない場合には, 256 スタックポインタを調整する.また,出口処理でスタックポインタを元に戻せるように,調整量を保存する. 257 258 259 ○OSの実装 260 261 1.プロセッサ依存部名称: arm64 262 263 ARMv8 では,64ビットモード(AArch64)および32ビットモード(AArch32)の両方をサポートするが 264 本実装は64ビットモードのみをサポートすることを明示するためプロセッサ依存部名称を arm64 とした 265 266 2. 例外モードの使い分け 267 268 本実装ではタスクコンテキスト,非タスクコンテキストいずれも例外レベル1(EL1)で動作する. 269 タスクコンテキストをEL0で動作する案も考えられる.その場合は割込み/例外の出口処理において 270 遅延ディスパッチの前に例外レベルの切り替えが必要となる. 271 272 3.ディスパッチャの実行モード 273 274 本実装ではすべて例外レベル1で動作するため,ディスパッチャは例外レベル1(EL1)で動作する. 275 276 277 4.スタックの使い分け 278 279 SSPではタスクコンテキスト,非タスクコンテキスト共に一つのスタックを共用する. 280 本実装ではSP_ELxを使用している. 281 この他にSP_EL0を使用する実装も考えられる.その場合は割込み/例外の入口処理にて 282 レジスタを保存する前にSP_EL0へのスタック切り替えを行う. 283 284 5.コンテキストの判定 285 286 割込み/例外のネスト回数を保持する変数(intnest)が0ならタスクタスクコンテキスト, 287 1以上なら非タスクコンテキストとする. 288 コンテキスト毎に例外レベルを分ける実装を取る場合はPSTATEのビット2および3で 289 例外レベルを読み出すことにより判別するという方法も考えられる. 290 本実装ではコンテキストによらず同じ例外レベルを使用し,プロセッサの 291 ステータスレジスタでは判別ができないため変数で判別する. 292 293 6. CPUロック 294 295 CPUロックPSTATE.IおよびPSTATE.FによりCPUロックを実現する. 296 297 7. 割込みロックとCPU例外の関係 298 299 カーネル管理外の割込みはサポートしないため,割込みロックとCPUロックがマスクする 300 割込みの範囲は同じとする.ただし,フラグ自体はお互いに独立させるため, 301 割込みロック状態の設定/解除の際は,ロック前にCPUロックフラグの状態を保存し, 302 解除前に元の状態に戻すようにしている. 303 304 8. 外部優先度と内部優先度 305 306 外部優先度とはAPIで指定する割込み優先度(PRI型)のことであり,値が小さい 307 ほど優先度が高い.割込みハンドラには,-1から連続した負の値を設定可能で 308 ある.内部優先度は,GICC_PMRレジスタに設定する値である. 309 外部優先度と内部優先度の変換は以下のマクロで表現される. 310 311 /* 外部表現への変換 */ 408 312 #define EXT_IPM(pri) \ 409 313 (((PRI)((pri) >> GIC_PRI_SHIFT)) - (GIC_PRI_LEVEL - 1)) 410 314 411 /* å 412 é¨è¡¨ç¾ã¸ã®å¤æ */ 315 /* 内部表現への変換 */ 413 316 #define INT_IPM(ipm) \ 414 317 (((uint_t)((ipm) + (GIC_PRI_LEVEL - 1))) << GIC_PRI_SHIFT) 415 318 416 ããã§GIC_PRI_LEVELã¯ãµãã¼ãããå²è¾¼ã¿åªå 417 度ã®æ°ï¼GIC_PRI_SHIFTã¯GICC_PMRã¬ã¸ã¹ã¿å 418 419 ã®ï¼å 420 é¨åªå 421 度ã®å¤ãæ ¼ç´ãããä½ç½®ï¼ããã0ããã®ãªãã»ããï¼ã表ãï¼ 422 423 424 9. ã«ã¼ãã«ç®¡çå 425 ã®æé«åªå 426 度(CPUããã¯ç¶æ 427 ã§ã®åªå 428 度ãã¹ã¯) 429 430 ã«ã¼ãã«ç®¡çå 431 ã®å²è¾¼ã¿ã®æé«åªå 432 度ã¯è¨å®å¯è½ãªå¤é¨åªå 433 度ã®æé«å¤ã¨åãã¨ããï¼ 434 435 436 以ä¸ï¼ 319 ここでGIC_PRI_LEVELはサポートする割込み優先度の数,GIC_PRI_SHIFTはGICC_PMRレジスタ内 320 の,内部優先度の値が格納される位置(ビット0からのオフセット)を表す. 321 322 323 9. カーネル管理内の最高優先度(CPUロック状態での優先度マスク) 324 325 カーネル管理内の割込みの最高優先度は設定可能な外部優先度の最高値と同じとする. 326 327 328 以上. -
Property svn:mime-type
set to
Note:
See TracChangeset
for help on using the changeset viewer.