source: ssp_aarch64/trunk/arm64_gcc/prc_design.txt@ 353

Last change on this file since 353 was 353, checked in by nmir-saito, 6 years ago

initial import

File size: 16.1 KB
Line 
1=====================================================================
2 ARM64プロセッサ依存部設計メモ
3 Last Modified: 5 Jun 2018
4=====================================================================
5
6○このドキュメントの位置づけ
7
8このドキュメントは,TOPPERS/SSPカーネルをARMv8-Aプロセッサに移植する際
9の設計メモである.
10
11
12○ARMv8-Aの仕様まとめ
13
14ARMv8-Aの仕様のうち,カーネルの設計に関係する事項
15についてまとめる.
16
17●レジスタ
18
19汎用レジスタはr0〜r30 (特に64ビットレジスタはX0..X30で表現)の31種類からなる.
20(参考)「Procedure Call Standard for the ARM 64-bit Architecture」
21
22r0...r7 Parameter/result registers(引数および返値の受け渡し用)
23r8 Indirect result location register (大きなデータ構造を
24 返値として返す場合など,呼び出し側が結果を取り出すために
25 間接アドレッシングを多用する際,そのベースアドレスを受け渡し
26 するために使われる)
27r9..r15 Caller-saved Temporary registers(呼び出し側で保存すべきレジスタ)
28r16(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 関数テーブル
37r17(IP1) The second intra-procedure-call temporary register(r16と役割は同じ)
38r18 The Platform Register(プラットフォームABIで使用されるレジスタ.
39 ABIで使われない場合はテンポラリレジスタとして使われる)
40r19..r28 Callee-saved registers(呼び出された側で保存して使うレジスタ)
41r29(FP) The Frame Pointer(フレームポインタ)
42r30(LR) The Link Register(リンクレジスタ)
43
44SSPカーネルのアセンブラによる実装
45ではr8, r16...r18は使用していない.
46
47
48●コーリングコンベンション
49
50r0...R7 が引数および返値に使われる.
51ARMにより規定されているため,コンパイラに依存せずこのルールとなる
52
53●PSTATE
54
55AArch64ではプロセッサの状æ…
56‹ã‚’表すフラグの集まりをまとめてPSTATEと呼び,
57それぞれのフラグへ別々
58にアクセスするための特別なレジスタ名が定義されている.
59
60PSTATEの詳細は,ARM Architecture Reference Manual
61ARMv8, for ARMv8-A architecture profile の D1.7 などを参ç…
62§ã®ã“と.
63
64・spsel
65EL1より上の例外レベルでは,spsel という特別な名称のレジスタにアクセスし,
66PSTATE.SPフラグの値をセットして使用スタックの切り替えを行う.
67
68・daif
69daif という名称のレジスタを使用してPSTATEのD,A,I,Fビットを操作し,
70各種例外および割込みの禁止/許可を制御する
71
72
73SSPカーネルの実装
74では,スタックはSP_EL1のみを使用する.
75また,CPUロック状æ…
76‹ãŠã‚ˆã³å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
77‹ã®å®Ÿè£…
78にPSTATEのIおよびFフラグを
79利用している.
80
81
82●割込みベクタ
83
84ベクタテーブルのアドレスはリセット時に,システムレジスタの一つVector Base
85Address Register(VBAR, システムレジスタ)にアドレスをセットすることで,
862048バイト境界の任意のアドレスにé…
87ç½®å¯èƒ½ã§ã‚る.
88
89SSPカーネルの実装
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
135SSPの実装
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ˆé ­ã‹ã‚‰ã®ã‚ªãƒ•ã‚»ãƒƒãƒˆ
161 AArch64, EL1t(EL1, SP_EL0) Synchronous 0 0x0000
162 AArch64, EL1t(EL1, SP_EL0) SError 1 0x0180
163 AArch64, EL1h(EL1, SP_EL1) Synchronous 2 0x0200
164 AArch64, EL1h(EL1, SP_EL1) SError 3 0x0380
165 AArch64, EL0 (EL0, SP_EL0) Synchronous 4 0x0400
166 AArch64, EL0 (EL0, SP_EL0) SError 5 0x0580
167 AArch32, EL0 (EL0, SP_EL0) Synchronous 6 0x0600
168 AArch32, EL0 (EL0, SP_EL0) SError 7 0x0780
169
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を設定すると
182SP_EL0 を選択する.
183
184SSPの実装
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
204QEMU Virt向けSSPの実装
205ではEL1のみを使用するため,例外レベル間の遷移処理は行っていない.
206
207●例外レベルの判定
208
209現状の例外レベルを判定するには,CPSRのビット2およびビット3の値を使用する.
210bit[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 ンテキストを保存する.
235
236 ---------------
237 | GICC_PMR | <- new SP
238 ----------------
239 | 割込み/例外番号|
240 ----------------
241 | ダミー(0) |
242 ----------------
243 | 調整量(0 or 8) |
244 ----------------
245 |調整領域(必
246要時)| (*)アライメント調整が必
247要なときのみ
248 ----------------
249 | ESR_ELx |
250 ----------------
251 | ELR_ELx |
252 ----------------
253 | SPSR_ELx |
254 ----------------
255 | X30 |
256 ----------------
257 | X29 |
258 ----------------
259 | : |
260 | : |
261 ----------------
262 | X1 |
263 ----------------
264 | X0 |
265 ----------------
266 | | <- old SP
267
268
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
318AArch64では,外部インタフェースにおいてスタックポインタは16バイト境界に
319アラインさせる必
320要がある.しかし例外発生時にそれが満たされているとは限らないため,
321割込み/CPU例外のå…
322¥å£å‡¦ç†ã§ï¼Œã‚¹ã‚¿ãƒƒã‚¯ãƒã‚¤ãƒ³ã‚¿ãŒã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆæ¡ä»¶ã‚’満たしていない場合には,
323スタックポインタを調整する.また,出口処理でスタックポインタをå…
324ƒã«æˆ»ã›ã‚‹ã‚ˆã†ã«ï¼Œèª¿æ•´é‡ã‚’保存する.
325
326
327○OSの実装
328
329
3301.プロセッサ依存部名称: arm64
331
332ARMv8 では,64ビットモード(AArch64)および32ビットモード(AArch32)の両方をサポートするが
333本実装
334は64ビットモードのみをサポートすることを明示するためプロセッサ依存部名称を arm64 とした
335
3362. 例外モードの使い分け
337
338本実装
339ではタスクコンテキスト,非タスクコンテキストいずれも例外レベル1(EL1)で動作する.
340タスクコンテキストをEL0で動作する案も考えられる.その場合は割込み/例外の出口処理において
341遅
342延ディスパッチの前に例外レベルの切り替えが必
343要となる.
344
3453.ディスパッチャの実行モード
346
347本実装
348ではすべて例外レベル1で動作するため,ディスパッチャは例外レベル1(EL1)で動作する.
349
350
3514.スタックの使い分け
352
353SSPではタスクコンテキスト,非タスクコンテキストå…
354±ã«ä¸€ã¤ã®ã‚¹ã‚¿ãƒƒã‚¯ã‚’å…
355±ç”¨ã™ã‚‹ï¼Ž
356本実装
357ではSP_ELxを使用している.
358この他にSP_EL0を使用する実装
359も考えられる.その場合は割込み/例外のå…
360¥å£å‡¦ç†ã«ã¦
361レジスタを保存する前にSP_EL0へのスタック切り替えを行う.
362
3635.コンテキストの判定
364
365割込み/例外のネスト回数を保持する変数(intnest)が0ならタスクタスクコンテキスト,
3661以上なら非タスクコンテキストとする.
367コンテキスト毎に例外レベルを分ける実装
368を取る場合はPSTATEのビット2および3で
369例外レベルを読み出すことにより判別するという方法も考えられる.
370本実装
371ではコンテキストによらず同じ例外レベルを使用し,プロセッサの
372ステータスレジスタでは判別ができないため変数で判別する.
373
3746. CPUロック
375
376CPUロックPSTATE.IおよびPSTATE.FによりCPUロックを実現する.
377
3787. 割込みロックとCPU例外の関係
379
380カーネル管理外の割込みはサポートしないため,割込みロックとCPUロックがマスクする
381割込みの範囲は同じとする.ただし,フラグ自体はお互いに独立させるため,
382割込みロック状æ…
383‹ã®è¨­å®š/解除の際は,ロック前にCPUロックフラグの状æ…
384‹ã‚’保存し,
385解除前にå…
386ƒã®çŠ¶æ…
387‹ã«æˆ»ã™ã‚ˆã†ã«ã—ている.
388
3898. 外部優å…
390ˆåº¦ã¨å†…
391部優å…
392ˆåº¦
393
394外部優å…
395ˆåº¦ã¨ã¯APIで指定する割込み優å…
396ˆåº¦(PRI型)のことであり,値が小さい
397ほど優å…
398ˆåº¦ãŒé«˜ã„.割込みハンドラには,-1から連続した負の値を設定可能で
399ある.内
400部優å…
401ˆåº¦ã¯ï¼ŒGICC_PMRレジスタに設定する値である.
402外部優å…
403ˆåº¦ã¨å†…
404部優å…
405ˆåº¦ã®å¤‰æ›ã¯ä»¥ä¸‹ã®ãƒžã‚¯ãƒ­ã§è¡¨ç¾ã•ã‚Œã‚‹ï¼Ž
406
407/* 外部表現への変換 */
408#define EXT_IPM(pri) \
409 (((PRI)((pri) >> GIC_PRI_SHIFT)) - (GIC_PRI_LEVEL - 1))
410
411/* 内
412部表現への変換 */
413#define INT_IPM(ipm) \
414 (((uint_t)((ipm) + (GIC_PRI_LEVEL - 1))) << GIC_PRI_SHIFT)
415
416ここでGIC_PRI_LEVELはサポートする割込み優å…
417ˆåº¦ã®æ•°ï¼ŒGIC_PRI_SHIFTはGICC_PMRレジスタ内
418
419の,内
420部優å…
421ˆåº¦ã®å€¤ãŒæ ¼ç´ã•ã‚Œã‚‹ä½ç½®ï¼ˆãƒ“ット0からのオフセット)を表す.
422
423
4249. カーネル管理内
425の最高優å…
426ˆåº¦(CPUロック状æ…
427‹ã§ã®å„ªå…
428ˆåº¦ãƒžã‚¹ã‚¯)
429
430カーネル管理内
431の割込みの最高優å…
432ˆåº¦ã¯è¨­å®šå¯èƒ½ãªå¤–部優å…
433ˆåº¦ã®æœ€é«˜å€¤ã¨åŒã˜ã¨ã™ã‚‹ï¼Ž
434
435
436以上.
Note: See TracBrowser for help on using the repository browser.