source: ssp_rpi3/trunk/arch/arm64_gcc/common/core_design.txt@ 384

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

add target dependent files of ssp for rpi3

  • Property svn:keywords set to Id
File size: 15.6 KB
Line 
1=====================================================================
2 ARM64プロセッサ依存部設計メモ
3 Last Modified: 16 Apr 2019
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
54● PSTATE
55
56AArch64ではプロセッサの状æ…
57‹ã‚’表すフラグの集まりをまとめてPSTATEと呼び,
58それぞれのフラグへ別々
59にアクセスするための特別なレジスタ名が定義されている.
60
61PSTATEの詳細は,ARM Architecture Reference Manual
62ARMv8, for ARMv8-A architecture profile の D1.7 などを参ç…
63§ã®ã“と.
64
65・spsel
66EL1より上の例外レベルでは,spsel という特別な名称のレジスタにアクセスし,
67PSTATE.SPフラグの値をセットして使用スタックの切り替えを行う.
68
69・daif
70daif という名称のレジスタを使用してPSTATEのD,A,I,Fビットを操作し,
71各種例外および割込みの禁止/許可を制御する
72
73
74SSPカーネルの実装
75では,スタックはSP_EL1のみを使用する.
76また,CPUロック状æ…
77‹ãŠã‚ˆã³å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
78‹ã®å®Ÿè£…
79にPSTATEのIおよびFフラグを
80利用している.
81
82
83● 割込みベクタ
84
85ベクタテーブルのアドレスはリセット時に,システムレジスタの一つVector Base
86Address Register(VBAR, システムレジスタ)にアドレスをセットすることで,
872048バイト境界の任意のアドレスにé…
88ç½®å¯èƒ½ã§ã‚る.
89
90SSPカーネルの実装
91ではスタートアップルーチンで設定している.
92
93
94● 割込み
95
96ここではGICを搭載するプロセッサの場合について述べる.
97それ以外の場合についてはチップ依存部のドキュメントに記載する.
98
99
100●割込み優å…
101ˆåº¦
102
103GICにおいては割込み優å…
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
135GICの場合,割込みを受け付けると受け付けた割込みの番号がGICC_IARにセットされる.
136割込み番号はこのレジスタにセットされる値を使用する.
137
138例外番号は,例外発生時のプロセッサ状æ…
139‹ã«å¿œã˜ã¦æ±ºå®šã•ã‚Œã‚‹ï¼Œãƒ™ã‚¯ã‚¿ãƒ†ãƒ¼ãƒ–ル中の
140ジャンプå…
141ˆã‚ªãƒ•ã‚»ãƒƒãƒˆæ¯Žã«ç•°ãªã‚‹ç•ªå·ã‚’割り振ることにしている.
142
143 例外発生時の状æ…
144‹ 例外の種類 例外番号  例外ベクタå…
145ˆé ­ã‹ã‚‰ã®ã‚ªãƒ•ã‚»ãƒƒãƒˆ
146 AArch64, EL1t(EL1, SP_EL0) Synchronous 0 0x0000
147 AArch64, EL1t(EL1, SP_EL0) SError 1 0x0180
148 AArch64, EL1h(EL1, SP_EL1) Synchronous 2 0x0200
149 AArch64, EL1h(EL1, SP_EL1) SError 3 0x0380
150 AArch64, EL0 (EL0, SP_EL0) Synchronous 4 0x0400
151 AArch64, EL0 (EL0, SP_EL0) SError 5 0x0580
152 AArch32, EL0 (EL0, SP_EL0) Synchronous 6 0x0600
153 AArch32, EL0 (EL0, SP_EL0) SError 7 0x0780
154
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
173SSPの実装
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を設定すると
192SP_EL0 を選択する.
193
194SSPの実装
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
215QEMU Virt向けSSPの実装
216ではEL1のみを使用するため,例外レベル間の遷移処理は行っていない.
217
218
219●例外レベルの判定
220
221現状の例外レベルを判定するには,CPSRのビット2およびビット3の値を使用する.
222bit[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 ンテキストを保存する.
247
248 --------------- <- new SP
249 | GICC_PMR |
250 ----------------
251 | 割込み/例外番号|
252 ----------------
253 | ESR_ELx |
254 ----------------
255 | ELR_ELx |
256 ----------------
257 | SPSR_ELx |
258 ----------------
259 | X30 |
260 ----------------
261 | X29 |
262 ----------------
263 | : |
264 | : |
265 ----------------
266 | X1 |
267 ----------------
268 | X0 |
269 ---------------- <- old SP
270 | |
271
272
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
3241.コア依存部名称: arm64
325
326ARMv8 では,64ビットモード(AArch64)および32ビットモード(AArch32)の両方をサポートするが
327本実装
328は64ビットモードのみをサポートすることを明示するためプロセッサ依存部名称を arm64 とした
329
3302. 例外モードの使い分け
331
332本実装
333ではタスクコンテキスト,非タスクコンテキストいずれも例外レベル1(EL1)で動作する.
334タスクコンテキストをEL0で動作する案も考えられる.その場合は割込み/例外の出口処理において
335遅
336延ディスパッチの前に例外レベルの切り替えが必
337要となる.
338
3393.ディスパッチャの実行モード
340
341本実装
342ではすべて例外レベル1で動作するため,ディスパッチャは例外レベル1(EL1)で動作する.
343
344
3454.スタックの使い分け
346
347SSPではタスクコンテキスト,非タスクコンテキストå…
348±ã«ä¸€ã¤ã®ã‚¹ã‚¿ãƒƒã‚¯ã‚’å…
349±ç”¨ã™ã‚‹ï¼Ž
350本実装
351ではSP_ELxを使用している.
352この他にSP_EL0を使用する実装
353も考えられる.その場合は割込み/例外のå…
354¥å£å‡¦ç†ã«ã¦
355レジスタを保存する前にSP_EL0へのスタック切り替えを行う.
356
3575.コンテキストの判定
358
359割込み/例外のネスト回数を保持する変数(intnest)が0ならタスクタスクコンテキスト,
3601以上なら非タスクコンテキストとする.
361コンテキスト毎に例外レベルを分ける実装
362を取る場合はPSTATEのビット2および3で
363例外レベルを読み出すことにより判別するという方法も考えられる.
364本実装
365ではコンテキストによらず同じ例外レベルを使用し,プロセッサの
366ステータスレジスタでは判別ができないため変数で判別する.
367
3686. CPUロック
369
370CPUロックPSTATE.IによりCPUロックを実現する.
371
3727. 割込みロックとCPU例外の関係
373
374FIQをカーネル管理外の割込みとするため,割込みロックはPSTATE.Iに加えて
375PSTATE.Fも用いて実現する.ただし,フラグをお互いに独立させるため,
376割込みロック状æ…
377‹ã®è¨­å®š/解除の際は,ロック前にCPUロックフラグ(=PSTATE.I)の
378状æ…
379‹ã‚’保存し,解除前にå…
380ƒã®çŠ¶æ…
381‹ã«æˆ»ã™ã‚ˆã†ã«ã—ている.
382
3838. 外部優å…
384ˆåº¦ã¨å†…
385部優å…
386ˆåº¦
387
388外部優å…
389ˆåº¦ã¨ã¯APIで指定する割込み優å…
390ˆåº¦(PRI型)のことであり,値が小さい
391ほど優å…
392ˆåº¦ãŒé«˜ã„.割込みハンドラには,-1から連続した負の値を設定可能で
393ある.GICの場合,内
394部優å…
395ˆåº¦ã¯ï¼ŒGICC_PMRレジスタに設定する値である.
396外部優å…
397ˆåº¦ã¨å†…
398部優å…
399ˆåº¦ã®å¤‰æ›ã¯ä»¥ä¸‹ã®ãƒžã‚¯ãƒ­ã§è¡¨ç¾ã•ã‚Œã‚‹ï¼Ž
400
401/* 外部表現への変換 */
402#define EXT_IPM(pri) \
403 (((PRI)((pri) >> GIC_PRI_SHIFT)) - (GIC_PRI_LEVEL - 1))
404
405/* 内
406部表現への変換 */
407#define INT_IPM(ipm) \
408 (((uint_t)((ipm) + (GIC_PRI_LEVEL - 1))) << GIC_PRI_SHIFT)
409
410ここでGIC_PRI_LEVELはサポートする割込み優å…
411ˆåº¦ã®æ•°ï¼ŒGIC_PRI_SHIFTはGICC_PMRレジスタ内
412
413の,内
414部優å…
415ˆåº¦ã®å€¤ãŒæ ¼ç´ã•ã‚Œã‚‹ä½ç½®ï¼ˆãƒ“ット0からのオフセット)を表す.
416
417
4189. カーネル管理内
419の最高優å…
420ˆåº¦(CPUロック状æ…
421‹ã§ã®å„ªå…
422ˆåº¦ãƒžã‚¹ã‚¯)
423
424GICの場合,カーネル管理内
425の割込みの最高優å…
426ˆåº¦ã¯è¨­å®šå¯èƒ½ãªå¤–部優å…
427ˆåº¦ã®æœ€é«˜å€¤ã¨åŒã˜ã¨ã™ã‚‹ï¼Ž
428
429
430以上.
Note: See TracBrowser for help on using the repository browser.