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