source: anotherchoice/tags/jsp-1.4.4-full-UTF8/doc/powerpc32.txt@ 26

Last change on this file since 26 was 26, checked in by ykominami, 12 years ago

initial

File size: 76.4 KB
Line 
1
2 = TOPPERS/JSPカーネル ユーザズマニュアル =
3 (PowerPC32 ターゲット依存部)
4
5 (Release 1.4.1 対応、最終更新: 07-Oct-2004)
6
7------------------------------------------------------------------------
8 TOPPERS/JSP Kernel
9 Toyohashi Open Platform for Embedded Real-Time Systems/
10 Just Standard Profile Kernel
11
12 Copyright (C) 2000-2004 by Embedded and Real-Time Systems Laboratory
13 Toyohashi Univ. of Technology, JAPAN
14 Copyright (C) 2001-2004 by Industrial Technology Institute,
15 Miyagi Prefectural Government, JAPAN
16
17 上記著作権者
18は、Free Software Foundation によってå…
19¬è¡¨ã•ã‚Œã¦ã„ã‚‹
20 GNU General Public License の Version 2 に記述されている条件か、以
21 下の(1)〜(4)の条件を満たす場合に限り、本ソフトウェア(本ソフトウェ
22 アを改変したものを含む。以下同じ)を使用・複製・改変・再é…
23å¸ƒï¼ˆä»¥ä¸‹ã€
24 利用と呼ぶ)することを無償で許諾する。
25 (1) 本ソフトウェアをソースコードの形で利用する場合には、上記の著作
26 権表示、この利用条件および下記の無保証規定が、そのままの形でソー
27 スコード中に含まれていること。
28 (2) 本ソフトウェアを再利用可能なバイナリコード(リロケータブルオブ
29 ジェクトファイルやライブラリなど)の形で利用する場合には、利用
30 に伴うドキュメント(利用者
31マニュアルなど)に、上記の著作権表示、
32 この利用条件および下記の無保証規定を掲載すること。
33 (3) 本ソフトウェアを再利用不可能なバイナリコードの形または機器に組
34 み込んだ形で利用する場合には、次のいずれかの条件を満たすこと。
35 (a) 利用に伴うドキュメント(利用者
36マニュアルなど)に、上記の著作
37 権表示、この利用条件および下記の無保証規定を掲載すること。
38 (b) 利用の形æ…
39‹ã‚’、別に定める方法によって、上記著作権者
40に報告する
41 こと。
42 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
43 害からも、上記著作権者
44をå…
45è²¬ã™ã‚‹ã“と。
46
47 本ソフトウェアは、無保証で提供されているものである。上記著作権者
48は、
49 本ソフトウェアに関して、その適用可能性も含めて、いかなる保証も行わ
50 ない。また、本ソフトウェアの利用により直接的または間接的に生じたい
51 かなる損害に関しても、その責任を負わない。
52------------------------------------------------------------------------
53
541. PowerPC32 ターゲット依存部の概要
55
561.1 ターゲットシステムと開発環境
57
58PowerPC32プロセッサのターゲットシステムとしては、以下のプロセッサをサ
59ポートしている。
60
61・MPC860T (モトローラ)
62
63サポートしているボードは、以下の通りである。
64
65・(株)タンバック製 TB6102S(CPU:MPC860T)
66
67開発環境には、GCC などの GNU開発環境を用い、オブジェクトファイルフォー
68マットは ELF を標準とする。
69
70ディレクトリ構成を以下に示す。PowerPC版ではシステム依存部で一部プロ
71セッサ依存(主に割込みコントローラ依存)行っている。そのため、プロセッ
72サ依存部とシステム依存部という表記は誤解を招きやすいので、以後、$CPU
73ディレクトリと$SYSディレクトリという表記を用いる。
74
75 $CPU=powerpc32ディレクトリ
76   PowerPCå…
77±é€šéƒ¨
78    PowerPCアーキテクチャによって規定されている範囲内
79で
80    実装
81できる部分
82    すべてのPowerPC系プロセッサでå…
83±é€šã«ä½¿ç”¨ã§ãã‚‹ã€‚
84    
85 $SYSディレクトリ
86   従来のボード依存部(システム依存部)
87   割込みコントローラ依存
88   タイマドライバ
89   シリアルドライバ
90
91また、The IBM PowerPC Embedded Environmentアーキテクチャ向けのシステム
92依存部のサンプルコードをレファレンス用に含んでいるが、こちらは動作確認
93していない。(デバイス依存の定義を適宜、追加する必
94要がある。)
95
961.2 サポートする機能の概要
97
98PowerPC32ターゲット依存の機能として、割込みマスクの変更・参ç…
99§(chg_ipm、
100get_ipm)と、性能評価用システム時刻参ç…
101§æ©Ÿèƒ½(vxget_tim)をサポートしてい
102る。割込みの禁止と許可(dis_int、ena_int)はサポートしていない。
103
1041.3 他のターゲットへのポーティング
105
106PowerPCアーキテクチャはプロセッサ・コアの部分のみが規定されており、こ
107のコアを用いたプロセッサが各半導体メーカーから製品化されている。割込み
108コントローラの仕様が各インプリメンテーション毎に異なっているため、割込
109みコントローラ依存の処理は$SYSディレクトリ(システム依存部)に分離され
110ている。他のPowerPCアーキテクチャ・プロセッサへポーティングする場合は
111$SYSディレクトリ以下を修正すればよい。
112ポーティングの工数は割り込みコントローラのアーキテクチャに依存する。
113(å…
114·ä½“的な修正項
115目は「7. カーネル移植者
116向けの情
117報」を参ç…
118§ï¼‰
119
120なお、今回はPowerPC 32ビットアーキテクチャを対象にカーネルの実装
121を行っ
122た。
123
1241.4 GDB スタブ
125
126現在の TOPPERS/JSPカーネル PowerPC32版はROM化のみをサポートしている。
127将来、GDBスタブと組み合わせて使用することを考æ…
128®ã—て、他機種版のJSPカー
129ネルと同様にソースコード内
130にGDB_STUBマクロによる条件コンパイルの設定を
131行っている。
132
1331.5 シリアルポート
134
135カーネルのログ出力用にシリアルポートを1つ使用する。
136シリアルポートの設定は
137 ・8ビット
138 ・パリティなし
139 ・ストップビット:1ビット
140 ・ボーレート:9600bps
141である。
142
143なお、ボーレートについては、BAUD_RATEマクロにて定義しているので必
144要に
145応じて変更することができる。
146(user_config.h)
147
1481.6 エンディアン
149
150各ターゲットはディップスイッチによりエンディアンを変更することが可能で
151ある。これに合わせて、カーネルのエンディアンの設定は各システム依存部で
152変更可能である。エンディアンは以下の個所で設定する。
153
154 ・$SYSディレクトリの Makefile.config
155 コンパイルオプション
156  -mbig:ビッグ・エンディアン
157  -mlittle:リトル・エンディアン
158
159 ・システム定義(user_config.h)
160 SIL_ENDIAN
161  SIL_ENDIAN_BIG:ビッグ・エンディアン
162  SIL_ENDIAN_LITTLE:リトル・エンディアン
163
164 注意
165  リトル・エンディアンでの動作確認は行っていない
166
167
1682. PowerPC32ターゲット依存部の機能
169
170この節では、カーネルおよびシステムサービスの機能の中で、PowerPC32ター
171ゲット依存の部分について解説する。
172
1732.1 データ型
174
175int型および unsigned int型のサイズは 32ビットである。
176
1772.2 インプリメンテーション依存性の記述方法について
178
179PowerPC32アーキテクチャは割込みコントローラを規定していないため、各イ
180ンプリメンテーションによって割込み処理が異なる。そこでPowerPC32依存部
181の実装
182では、$CPUディレクトリ直下にはPowerPC32アーキテクチャで規定され
183ている内
184容のみを記述し、インプリメンテーション依存(特に割り込みコント
185ローラ依存)の処理は$SYSディレクトリで定義している。
186今回利用したターゲット以外に移植するための割込み処理に関するインタ
187フェース情
188報は、この文書の最後に「7. カーネル移植者
189向けの情
190報」として
191まとめて記載しているので参ç…
192§ã®ã“と。
193
1942.3 割込み管理機能
195
196カーネル管理外の割込みとしては、 NMIがある。よって、CPUロック状æ…
197‹ã‚„初
198期化ルーチン内
199では、NMI 以外の割込みはすべて禁止されている。å…
200·ä½“的には、
201MSR(Machine Status Register)のEEビットが0に設定される。
202
203DEF_INH で指定する割込みハンドラ番号(inhno)は、プロセッサのハードウェ
204アの表記に合わせることを原則とする。
205
206割込みマスク/割込み優å…
207ˆåº¦åˆ¶å¾¡ã®ãŸã‚ã®ã€å®šç¾©ãƒ»APIは以下の通りである。
208
209(1) IPM型
210 割込みコントローラの割込みマスクを扱うための型である。
211(sys_defs.h)
212
213(2) define_ipm     割込み受付時の割込みマスクの設定
214                (オプション)
215【C言語API】
216 define_ipm(INHNO inhno, IPM ipm);
217
218【パラメータ】
219 INHNO inhno 割込みハンドラ番号
220 IPM ipm 割込みマスク
221
222【リターンパラメータ】
223 なし
224
225【機能】
226 割込みハンドラ番号inhnoの割込みを受け付けたときに割込み
227 コントローラのIPMに設定する値を定義する。割込みコントローラ
228 が多重割込みのレベル制御をハードウェアでサポートしていれば、
229 ソフトウェアでこのような準備をする必
230要はない。
231 デバイスドライバの初期化処理で使用されることを想定している
232 (sys_config.h)
233
2342.4 chg_ipmのサポートについて
235
236PowerPC32アーキテクチャ依存の機能として、割込みコントローラの割り込み
237マスクの値を変更するためのサービスコール chg_ipm と、参ç…
238§ã™ã‚‹ãŸã‚ã®
239サービスコール get_ipm をサポートしている。なお、割り込みマスクビット
240の値を表すデータ型 IPM は、$SYSディレクトリにて定義されている。
241
242これらのサービスコールは、タスクコンテキストで CPUロック解除状æ…
243‹ã®å ´åˆ
244にのみ呼び出すことができる。chg_ipm により 何らかの割込みが禁止されて
245いる状æ…
246‹ã«ã—た場合でも、ディスパッチは禁止されず、chg_ipm により変更し
247た IPM の値は、ディスパッチ後のタスクに引き継がれる。例えば、あるタス
248クで IPM を 0x01 に変更した後、何らかの割込みにより別のタスクに切り替
249わると、切り替わった後のタスクでも IPM は 0x01 になる。
250
251chg_ipm をサポートするために、割込みハンドラの出å…
252¥å£å‡¦ç†ãªã©ã«ã‚ªãƒ¼ãƒãƒ˜ãƒƒ
253ドを生じている。そこで、SUPPORT_CHG_IPM というマクロにより、これらのサー
254ビスコールをサポートするかどうかを切り替えられるようにしている。
255SUPPORT_CHG_IPM は、user_config.h の中で #define されている。
256
257PowerPC32ターゲット依存の割込みマスクの変更・参ç…
258§ã®ãŸã‚ã®ã‚µãƒ¼ãƒ“スコー
259ルの仕様は次の通り。
260
261(1) chg_ipm 割込みマスクの変更
262
263【C言語API】
264 ER ercd = chg_ipm(IPM ipm);
265
266【パラメータ】
267 IPM ipm 設定すべき IPM の値
268
269【リターンパラメータ】
270 ER ercd エラーコード
271
272【エラーコード】
273 E_CTX コンテキストエラー
274 E_PAR パラメータエラー(ipm が不正)
275
276【機能】
277
278 割込みマスクを ipm で指定された値に設定する。指定した値が割込みコン
279 トローラの割込みマスクの範囲内
280にå…
281¥ã£ã¦ã„ない場合にはE_PARエラーを返
282 す。
283 また、設定したIPMの値は、ディスパッチ後も引き継がれる。
284 
285 このサービスコールは、タスクコンテキストで CPUロック解除状æ…
286‹ã®æ™‚のみ
287 呼び出すことができる。非タスクコンテキストや CPUロック状æ…
288‹ã§å‘¼ã³å‡ºã—
289 た場合には、E_CTXエラーとなる。
290
291(2) get_ipm 割込みマスクの参ç…
292§
293
294【C言語API】
295 ER ercd = get_ipm(IPM *p_ipm);
296
297【パラメータ】
298 なし
299
300【リターンパラメータ】
301 ER ercd エラーコード
302 IPM *p_ipm 現在の IPM の値
303
304【エラーコード】
305 E_CTX コンテキストエラー
306
307【機能】
308
309 現在の 割込みマスクの値を読み出し、p_ipmが指し示す領域に書き込む。
310 
311 このサービスコールは、タスクコンテキストで CPUロック解除状æ…
312‹ã®æ™‚のみ
313 呼び出すことができる。非タスクコンテキストや CPUロック状æ…
314‹ã§å‘¼ã³å‡ºã—
315 た場合には、E_CTXエラーとなる。
316 
317 なお、トレースログ機能に関して、chg_ipmに関する部分はシステム依存部
318 にて定義を行っている。
319 (sys_tool_config.h)
320
321
3222.5 インプリメンテーション依存の定義
323
3242.5.1 MPC860T依存の定義
325
326(1) 割込み番号
327 mpc860t.hで定義している。
328
329 (SIU割込みソース)
330 割込み番号 | マクロ名 | 割込み要因
331 −−−−−−−−−−−−−−−−−−−−−−−−−−−−
332 0x0 | INTNO_IRQ0 | IRQ0
333 0x1 | INTNO_LVL0 | 内
334部レベル0
335 0x2 | INTNO_IRQ1 | IRQ1
336 0x3 | INTNO_LVL1 | 内
337部レベル1
338 0x4 | INTNO_IRQ2 | IRQ2
339 0x5 | INTNO_LVL2 | 内
340部レベル2
341 0x6 | INTNO_IRQ3 | IRQ3
342 0x7 | INTNO_LVL3 | 内
343部レベル3(タイマで使用)
344 0x8 | INTNO_IRQ4 | IRQ4
345 0x9 | INTNO_LVL4 | 内
346部レベル4(CPMで使用)
347 0xa | INTNO_IRQ5 | IRQ5
348 0xb | INTNO_LVL5 | 内
349部レベル5
350 0xc | INTNO_IRQ6 | IRQ6
351 0xd | INTNO_LVL6 | 内
352部レベル6
353 0xe | INTNO_IRQ7 | IRQ7
354 0xf | INTNO_LVL7 | 内
355部レベル7
356 −−−−−−−−−−−−−−−−−−−−−−−−−−−−
357
358 (CPM割込みソース)
359 割込み番号 | マクロ名 | 割込み要因
360 −−−−−−−−−−−−−−−−−−−−−−−−−−−−
361 0x10 | INTNO_ERR | エラー
362 0x11 | INTNO_PC4 | パラレルI/O PC4
363 0x12 | INTNO_PC5 | パラレルI/O PC
364 0x13 | INTNO_SMC2 | SMC2/PIP
365 0x14 | INTNO_SMC1 | SMC1
366 0x15 | INTNO_SPI | SPI
367 0x16 | INTNO_PC6 | パラレルI/O PC6
368 0x17 | INTNO_TIMER4 | タイマ4
369 0x18 | | 予約済み
370 0x19 | INTNO_PC7 | パラレルI/O PC7
371 0x1a | INTNO_PC8 | パラレルI/O PC8
372 0x1b | INTNO_PC9 | パラレルI/O PC9
373 0x1c | INTNO_TIMER3 | タイマ3
374 0x1d | | 予約済み
375 0x1e | INTNO_PC10 | パラレルI/O PC10
376 0x1f | INTNO_PC11 | パラレルI/O PC11
377 0x20 | INTNO_I2C | I2C
378 0x21 | INTNO_RISC | RISCタイマテーブル
379 0x22 | INTNO_TIMER2 | タイマ2
380 0x23 | | 予約済み
381 0x24 | INTNO_IDMA2 | IDMA2
382 0x25 | INTNO_IDMA1 | IDMA1
383 0x26 | INTNO_SDMA | SDMAチャネルバスエラー
384 0x27 | INTNO_PC12 | パラレルI/O PC12
385 0x28 | INTNO_PC13 | パラレルI/O PC13
386 0x29 | INTNO_TIMER1 | タイマ1
387 0x2a | INTNO_PC14 | パラレルI/O PC14
388 0x2b | INTNO_SCC4 | SCC4
389 0x2c | INTNO_SCC3 | SCC3
390 0x2d | INTNO_SCC2 | SCC2
391 0x2e | INTNO_SCC1 | SCC1
392 0x2f | INTNO_PC15 | パラレルI/O PC15
393 −−−−−−−−−−−−−−−−−−−−−−−−−−−−
394
395   SIU:System Interface Unit
396   CPM:Communication Processor Module
397
398(2) 割込みコントローラの割込みマスク
399
400MPC860Tではプロセッサに内
401蔵のシステム・インターフェース・ユニットSIUと
402通信プロセッサ・モジュールCPMがそれぞれ割込みコントローラを持っており、
403この2つの割込みコントローラがカスケード接続されている。
404今回の実装
405では、SIUの割込みマスク(SIU割込みマスクレジスタSIMASK)のみ
406カーネルで管理している。CPMについては割込みコントローラが多重割込みの
407レベル制御をハードウェアでサポートしてため、カーネルではCPM割込みマス
408クを管理していない。
409IPM型の定義は
410 typedef UH IPM;
411である。(sys_defs.h)
412また、CPMからSIUへの割込み要求レベルは4に設定されている。
413(user_config.hのマクロCPM_INT_LEVEL)
414
415(3) カーネルで使用しているデバイス(割込み要因)
416   ・MPC860T内
417蔵の周期割込みタイマPIT(内
418部レベル3)
419   ・MPC860T内
420蔵シリアル・マネージメントコントローラSMC1
421    (CPM割込みの一種なので、内
422部レベル4)
423
424(4) 各デバイスの割込み優å…
425ˆåº¦
426 優å…
427ˆåº¦ : (低) シリアルSMC1(レベル4) > タイマPIT(レベル3) (高)
428   
429
430
4312.5 CPU例外管理機能とCPU例外ハンドラ
432
433DEF_EXCで指定するCPU例外要因番号(excno)は、PowerPCアーキテクチャで規定
434されるCPU例外要因番号と一対一に対応している。
435そのデータ型(EXCNO)は UINT型に定義されている。
436
437DEF_EXCで例外要因番号として有効でない値やCPU例外に対応しない番号を指定
438した場合の動作は保証されない。
439
440CPU例外要因番号、マクロ名、CPU例外要因の対応関係を以下に示す。
441
442 1. EXC_NO_SYSTEM_RESET  システムリセット例外
443 2. EXC_NO_MACHINE_CHECK マシン・チェック例外
444 3. EXC_NO_DSI DSI例外
445 (データ・メモリ・アクセス)
446 4. EXC_NO_ISI ISI例外(命令フェッチ)
447 5. EXC_NO_EXTERNAL_INTERRUPT 外部割込み
448 6. EXC_NO_ALIGNMENT アライメント例外
449 7. EXC_NO_PROGRAM プログラム例外
450 8. EXC_NO_FLOATING_POINT_UNAVAILABLE
451 浮動小数点使用不可
452 9. EXC_NO_DECREMENTER デクリメンタ例外
45310. EXC_NO_IMPLEMENT_EXCEPTION_00A00
454 インプリメンテーション固有の例外0x00a00
45512. EXC_NO_SYSTEM_CALL システムコール
45613. EXC_NO_TRACE トレース(オプション)
45714. EXC_NO_FLOATING_POINT_ASSIST
458 浮動小数点補助
459
46015番以降にプロセッサ毎のインプリメンテーション固有の例外(0x01000)が
461定義されている場合もある。
462
463
464(1) CPU例外ハンドラへの引数p_excinf
465 CPU例外ハンドラに渡されるp_excinfは、CPU例外発生時のコンテキストを保
466 存したスタックへのポインタが渡される。スタックの構造を以下に示す。
467
468p_excinf --> --------------------
469 | r0 |
470 --------------------
471 | r3 |
472 --------------------
473 | r4 |
474 --------------------
475 | r5 |
476 --------------------
477 | r6 |
478 --------------------
479 | r7 |
480 --------------------
481 | r8 |
482 --------------------
483 | r9 |
484 --------------------
485 | r10 |
486 --------------------
487 | r11 |
488 --------------------
489 | r12 |
490 --------------------
491 | srr0 | /* 待
492避/復帰レジスタ0 */
493 --------------------
494 | srr1 | /* 待
495避/復帰レジスタ1 */
496 --------------------
497 | lr | /* リンク・レジスタ   */
498 --------------------
499 | ctr | /* カウント・レジスタ  */
500 --------------------
501 | cr | /* コンディション・レジスタ */
502 --------------------
503 | xer | /* 整数オペレーションの */
504 -------------------- /* 条件識別レジスタ */
505 | exc_no | /* 例外要因番号 */
506 --------------------
507
508(2) 未登録のCPU例外発生時の処理
509 未登録のCPU例外が発生した場合はカーネルが用意しているデフォルトのエ
510 ラー処理を行う。å…
511·ä½“的にはCPU例外発生時のレジスタの内
512容とCPU例外要因
513 をログ出力し、無限ループにå…
514¥ã‚‹ã€‚
515
516
5172.6 浮動小数点レジスタ
518
519PowerPC32では、浮動小数点レジスタがオプションで定義されている。
520カーネルも浮動小数点レジスタをサポートした実装
521を行っているが、実機での
522動作テストを行っていない。(ポーティングに用いたMPC860Tが浮動小数点レ
523ジスタを備えていないため)
524(cpu_support.S)
525
5262.7 スタートアップモジュール
527
528PowerPC32ターゲットでは、例外ベクタの一つに、リセット並びに NMI(Non
529Maskable Interrupt)用のベクタアドレスを備えている。このアドレスからの
530ジャンプå…
531ˆãŒã‚¹ã‚¿ãƒ¼ãƒˆã‚¢ãƒƒãƒ—モジュールとなっている。
532
533このスタートアップモジュール(start.S)では、次の初期化処理を行う。
534
535(A) プロセッサの初期化
536
537マシンス・テータス・レジスタを初期化し、プロセッサの動作モードを設定
538する。
539
540次に、スタックポインタ(r1)を STACKTOPに設定する。ここで割込みスタック
541ポインタに設定されたスタック領域は、カーネル起動後は非タスクコンテキス
542ト用のスタック領域として使われる。
543STACKTOPは、sys_config.h部で定義することを想定している。
544
545(B) hardware_init_hook の呼出し
546
547hardware_init_hook が 0 でない場合には、hardware_init_hook を呼び出す。
548hardware_init_hook は、一般にカーネルが起動される前に行う必
549要があるシ
550ステム依存の初期化を記述するものとする。(例:バスステート・コントロー
551ラの初期化、キャッシュの初期化、ウォッチドッグタイマの初期化など)
552記述場所は、sys_support.Sを標準とする。
553
554hardware_init_hook がどこにも定義されていない場合、リンカでこのシンボ
555ルを0に定義する(リンカスクリプト内
556に記述あり)。
557
558(C) bssセクションとdataセクションの初期化
559
560bssセクションをゼロクリアする。
561
562dataセクションを初期化する。ROM化対応のために、ROMからRAM へコピーを行
563う。
564
565(D) software_init_hook の呼出し
566
567software_init_hook が 0 でない場合には、software_init_hook を呼び出す。
568software_init_hook は、カーネルが起動される前に行う必
569要があるソフト
570ウェア環境(å…
571·ä½“的には、ライブラリ)依存の初期化を行うために用意している。
572software_init_hook がどこでも定義されていない場合、リンカでこのシンボ
573ルを0に定義する(リンカスクリプト内
574に記述あり)。
575
576(E) カーネルの起動
577
578kernel_start へ分岐し、カーネルを起動する。kernel_start からリターンし
579てくることは想定していない。
580
581
5823. システム依存部の機能
583
5843.1 システムクロックドライバ
585
586システムクロックドライバが isig_tim を呼び出す周期は、user_config.h 中
587のTIC_NUME と TIC_DENO で定義されている(デフォルトでは 1ミリ秒周期)。
588この定義を変更することで、isig_tim を呼び出す周期を変更することができ
589る。
590ただし、タイマの精度が供給クロックに依存するため、タイマの供給クロック
591単位で端数になる値を設定した場合には、isig_tim の呼出し周期に誤差が生
592じることになる。
593
594デフォルトでは、下記のタイマを利用している。
595(a) MPC860T依存部
596 MPC860T内
597蔵の周期割込みタイマPIT
598 (供給クロック周波数 12.5MHz)
599
6003.2 性能評価用システム時刻参ç…
601§æ©Ÿèƒ½
602
603PowerPC32ターゲット依存部では、性能評価用システム時刻参ç…
604§æ©Ÿèƒ½
605(vxget_tim)をサポートしている。SYSUTIM型はUD型(64ビットの符号無し整数
606型)で定義している。
607
608性能評価用システム時刻の精度は供給クロック単位であるが、タイマの現在値を
609読み出すために一時的にタイマを停止させる必
610要があるため、vxget_tim を呼ぶ
611度にシステムクロックが少しづつ遅
612れることになる。
613また、SUPPORT_VXGET_TIMというマクロにより、これらのサービスコールをサ
614ポートするかどうかを切り替えられるようにしている。
615(SUPPORT_VXGET_TIM は、user_config.h の中で #define されている。)
616
617(a) MPC860T依存部
618 性能評価用システム時刻の精度は80nsecである。
619 (タイマへの供給クロック周波数 12.5MHz)
620
6213.3 シリアルインタフェースドライバ
622
623(a) MPC860T
624 シリアルインタフェースドライバは、MPC860T内
625蔵シリアル・マネージメン
626 ト・コントローラSMC1をサポートしている。シリアルのサポートするポート
627 数は現状1chであり、user_config.h の中でTNUM_PORTマクロにて定義してい
628 る。
629
6303.4 メモリマップ
631
632メモリマップに関する設定は、リンカスクリプトにて行う。コンパイル時に利
633用するリンカスクリプトは$SYS/Makefile.configで指定する。
634
635各々
636のメモリマップは以下通りである。
637
638(a) MPC860T
639・(株)タンバック製 TB6102S
640
641(a-1) ROM化の場合(DBGENV = ROM):mpc860elf.ld
642 (SDRAM 16Mbyte)
643 0x00000100 - 0x00001fff 例外ベクタ
644 0x00002000 - データ領域
645 - 0x01000000 非タスクコンテキスト用スタック
646
647 (FLASH ROM 2Mbyte)
648 0x10000100 - 0x100001ff リセットベクタ
649 0x10000200 - 0x10001fff 例外ベクタのå…
650ƒãƒ‡ãƒ¼ã‚¿
651 0x10002000 - コード領域
652 - 0x10400000 変数の初期値データ
653
654備考
655 本来であれば、リセット直後は0x00000100番地から実行が開始されるところ
656 が、このボードの場合は以下の2つの理由からFlash ROMのå…
657ˆé ­+0x100番地
658 (=0x10000100番地)から実行が始まる。
659  (1) バス・ステート・コントローラが初期化されるまでは、すべてのアク
660    セスがメモリ・バンク0(Flash ROM)にヒットする。
661  (2) リセット時にアドレスバスのA20信号が不活性になっている。
662
663
664(a-2) RAM上にすべてダウンロードする場合
665  (DBGENV = DOWNLOAD_TO_RAM):ram_mpc860elf.ld
666
667 (SDRAM 16Mbyte)
668 0x00000100 - 0x00001fff 例外ベクタ
669 0x00002000 - コード領域
670 - 変数の初期値データ
671 0x00800000 - データ領域
672 - 0x01000000 非タスクコンテキスト用スタック
673
674備考
675 (JTAGデバッグツールなどで)デバッグの際に、毎回プログラムをFlash
676 RONに書き込んでいると作業効率が悪い。そこでプログラムのダウンロード
677 時間を短くするため、すべてのプログラムをRAM上にマップするリンクスク
678 リプトも用意している。$SYS/Makefile.configでDBGENV = DOWNLOAD_TO_RAM
679 を選択すると必
680要なマクロ定義が追加されとå…
681±ã«ã€ãƒªãƒ³ã‚¯ã‚¹ã‚¯ãƒªãƒ—トに
682 ram_mpc860elf.ldが指定される。バス・ステートコントローラの初期化処理
683 をFlash ROMに書き込んでおき、ここまで実行した時点(*1)でプログラムを
684 ダウンロードして0x100番地から実行を開始する。
685
686(*1) ROM化の設定でビルドしたものをFlash ROMに書き込んでおき、
687   sys_support.Sのラベルcopy_exception_vector行まで実行させれば良い。
688
689
690
6914. 開発環境の構築
692
693開発環境の構築方法については、GNU開発環境構築マニュアルを参ç…
694§ã™ã‚‹ã“と。
695なお、ターゲット環境 <TARGET> の値については、以下を参考のこと。
696開発にはWindows2000 SP4上のCygwinを用いた。
697
698動作確認は、下記のツールにて確認している。このツールをデフォルトとする。
699
700・GNUからé…
701å¸ƒã•ã‚Œã¦ã„るオリジナルのGCCなどをソースから構築したツール
702 動作確認を行ったときのバージョンは以下の通りである。
703 BINUTILS : 2.13.2.1
704 GCC-CORE : 2.95.3
705 NEWLIB : 1.11.0
706(この場合のターゲット環境 <TARGET> には、powerpc-elf を用いる。)
707
708・The IBM PowerPC Embedded Environmentアーキテクチャ用のシステム依存部
709 のサンプルコード(レファレンス実装
710)はザイリンクス社製EDK6.2に含まれ
711 るGNUツール(gcc-2.95.3相当)にてコンパイルが通るところまで確認している。
712 EDKに含まれるGNUツールをCygwinから使用する方法は下記のURLを参ç…
713§ã€‚
714  http://www.ertl.jp/~honda/microblaze/index.html
715
7165. 制限事項
717
718
719・64ビット・モードはサポートしていない。
720 (拡張は比較的容易と思われる。)
721
722・浮動小数点レジスタの退避/復å…
723ƒã¯å®Ÿæ©Ÿãƒ†ã‚¹ãƒˆã—ていない。
724 (ポーティングに用いたMPC860Tが浮動小数点レジスタを備えていないため)
725
726・リトル・エンディアン・モードでの実機テストを行っていない。
727
728・スタートアップルーチン、リンクスクリプトは、C++に対応していない。
729
730・SIL_LOC_INT()について
731 PowerPC版ではSIL_LOC_INT()の実装
732はCPUロックと同じ実現方法を用いてい
733 る。そのため、SIL_LOC_INT()で割込み禁止している区間では、sns_loc()
734 及びvxsns_loc()でCPUロック状æ…
735‹ã¨åˆ¤åˆ¥ã•ã‚Œã¦ã—まう。
736 JSPカーネルではå…
737ƒã€…
738、割込みロック中にはサービスコールを使用できないと
739 規定しているので、影響は少ないと思われる。
740 (jsp/user.txtの「5.1.1 割込みロック状æ…
741‹ã®åˆ¶å¾¡ã€å‚ç…
742§ï¼‰
743
744・.sdataおよび.sbssセクションについて
745 スタートアップルーチンおよびリンクスクリプトが.sdataおよび.sbssセク
746 ションに対応していない。また、コンフィギュレーション・チェッカーが
747 .sdataおよび.sbssセクションのメモリマッピングに対応していない。
748
749・The IBM PowerPC Embedded Environmentアーキテクチャについて
750 システム依存部のサンプルコードをレファレンス用に含んでいるが、動作
751 確認していない。(コンパイルが通るところまでは確認している。)
752 実際に動作させるにはデバイス依存の定義を適宜、追加する必
753要がある。
754
7556. その他
756
7576.1 ディレクトリ・ファイル構成
758
759PowerPC32 ターゲット依存部の各ファイルの概要は次の通り。
760
761 config/powerpc32/
762 PowerPC32å…
763±é€šéƒ¨
764
765 Makefile.config MakefileのPowerPC32ターゲット依存の定義
766 cpu_defs.h プロセッサ依存部のアプリケーション用定義
767 cpu_config.h プロセッサ依存部の構成定義
768 cpu_config.c プロセッサ依存部の関数
769 cpu_support.S プロセッサ依存部のサブルーチン
770 cpu_insn.h 低レベルのプロセッサ操作ルーチン
771 cpu_context.h コンテキスト操作
772 cpu_rename.def カーネルの内
773部識別名のリネーム定義
774 cpu_rename.h カーネルの内
775部識別名のリネーム
776 cpu_unrename.h カーネルの内
777部識別名のリネーム解除
778 vea_oea.h オリジナルのPowerPCアーキテクチャ用定義
779 vea_oea_emb.h The IBM PowerPC Embedded Environment
780 アーキテクチャ用定義
781 tool_defs.h 開発環境依存部のアプリケーション用定義
782 (GNU開発環境用)
783 tool_config.h 開発環境依存部の構成定義(GNU開発環境用)
784 powerpc32.h PowerPC32のレジスタ名などの定義
785 start.S スタートアップ・ルーチン
786 makeoffset.c offset.h 生成サポートプログラム
787
788 config/powerpc32/mpc860t/
789 MPC860T(モトローラ)対応システム依存部
790 ((株)タンバック製 TB6102S対応)
791
792 Makefile.config MakefileのTB6102Sシステム依存定義
793 user_config.h ユーザー定義情
794å ±
795 sys_defs.h システム依存部のアプリケーション用定義
796 sys_config.h システム依存部の構成定義
797 sys_config.c システム依存部の関数
798 sys_support.S システム依存部のサブルーチン
799 sys_rename.def カーネルの内
800部識別名のリネーム定義
801 sys_rename.h カーネルの内
802部識別名のリネーム
803 sys_unrename.h カーネルの内
804部識別名のリネーム解除
805 sys_tool_config.h 開発環境依存部のシステム依存部構成定義
806 (GNU開発環境用)
807 mpc860t.h MPC860Tのハードウェア定義
808 mpc860_sil.h MPC860T用アクセス・ルーチンの定義
809 tb6102s.h TB6102Sボードのハードウェア定義
810 hw_timer.h タイマ操作ルーチン
811 mpc860_pit.h MPC860T内
812蔵周期割込みタイマPITの
813 操作ルーチン
814 hw_serial.h SIOドライバ
815 hw_serial.cfg SIOドライバのコンフィギュレーションファイル
816 mpc860_smc.h MPC860T内
817蔵シリアル・マネージメント
818 コントローラSMC1の操作ルーチン
819 mpc860_smc.c 同上
820
821 mpc860elf.ld リンカスクリプト(ROM化用)
822 mpc860elf_ram.ld リンカスクリプト(デバッグ用)
823
824 config/powerpc32/ibm_ppc_emb_sample/
825 The IBM PowerPC Embedded Environmentアーキテクチャ対応
826 システム依存部のサンプルコード
827
828 Makefile.config Makefileのシステム依存定義
829 user_config.h ユーザー定義情
830å ±
831 sys_defs.h システム依存部のアプリケーション用定義
832 sys_config.h システム依存部の構成定義
833 (必
834要なマクロ定義のサンプル)
835 sys_config.c システム依存部の関数
836 sys_support.S システム依存部のサブルーチン
837 sys_rename.def カーネルの内
838部識別名のリネーム定義
839 sys_rename.h カーネルの内
840部識別名のリネーム
841 sys_unrename.h カーネルの内
842部識別名のリネーム解除
843 sys_tool_config.h 開発環境依存部のシステム依存部構成定義
844 (GNU開発環境用)
845 hw_timer.h タイマ操作ルーチン
846 pit.h タイマデバイスの操作ツーチン
847 hw_serial.h SIOドライバ
848 hw_serial.cfg SIOドライバのコンフィギュレーションファイル
849 smc.h シリアルデバイスの操作ルーチン
850 smc.c 同上
851 sample_elf.ld リンカスクリプト(ROM化用)
852
8536.2 ユーザーの設定項
854目
855
856PowerPC依存部では、ユーザーの設定項
857目をシステム依存部の2つのファイル
858Makefile.configとuser_config.hにまとめてあり、ユーザーはカーネル内
859部に
860立ちå…
861¥ã‚‰ãªãã¦ã‚‚、ある程度、設定を変更可能にしている。
862
8636.2.1 Makefile.configの設定項
864目
865
866・実行環境
867 変数DBGENVの設定により実行環境を選択する。
868  ・DBGENV=ROM:ROM化
869  ・DBGENV=GDB_STUB:GDB stub(未サポート)
870  ・DBGENV=DOWNLOAD_TO_RAM
871    デバッグ用にプログラムをすべてRAM領域にマッピングする設定
872    (TB6101Sボード固有)
873
874・エンディアン
875 コンパイルオプション(変数COPTS)として指定する
876  -mbig:ビッグ・エンディアン
877  -mlittle:リトル・エンディアン
878
879 注意
880  リトル・エンディアンでの動作確認は行っていない
881
882・メモリマッピング
883  ・TEXT_START_ADDRESS:textセクションのå…
884ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
885  ・DATA_START_ADDRESS:dataセクションのå…
886ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
887
8886.2.2 user_config.hの設定項
889目
890
891user_config.h内
892で以下のマクロ定義を行うことにより、設定を変更できる。
893
894(1) 条件コンパイル用のフラグとして用いるマクロ
895
896・SUPPORT_CHG_IPM
897  chg_ipm()を有効にする。
898
899・SUPPORT_VXGET_TIM
900  性能評価用システム時刻参ç…
901§æ©Ÿèƒ½vxget_tim()を有効にする。
902
903・SIL_ENDIAN
904 ・SIL_ENDIAN_BIG:ビッグ・エンディアン
905 ・SIL_ENDIAN_LITTLE:リトル・エンディアン
906
907・SUPPORT_POWER_MANAGEMENT
908  プロセッサが低消費電力モードを備えている。
909  (MSRのPOWビットが有効)
910  実行可能なタスクが1つもなく割込み待
911ちになるとき、プロセッサを
912  低消費電力モードに移行させる。
913  マクロSAVE_POWPERの説明を参ç…
914§ã€‚
915
916・USE_MULTIPLE_WORD_LOAD_STORE
917  レジスタの待
918避/復å…
919ƒã«æ•´æ•°ãƒ­ãƒ¼ãƒ‰ï¼ã‚¹ãƒˆã‚¢ãƒ»ãƒžãƒ«ãƒãƒ—ル命令を
920  使用する。
921  インプリメンテーションによっては同等の処理を行うロード/ストア命令
922  よりかえって遅
923くなるので注意
924
925・ABSOLUTE_JUMP_EXC_ENTRY
926  例外ベクタのé…
927ç½®ã«ã‚ˆã£ã¦ã¯ã€ä¾‹å¤–ベクタからtextセクションにある続き
928  の処理に分岐する際、b命令によるPC相対分岐(前後0x07ff,ffff)では届
929  かない場合がある。ABSOLUTE_JUMP_EXC_ENTRYマクロを定義すると絶対番
930  地を指定して分岐する実装
931に切り替わり、この問題を回避できる。
932
933(2) 値を設定するマクロ
934
935・STACKTOP
936  非タスクコンテキスト用スタックの初期値
937
938・SYSTEM_CLOCK
939  システムクロック[MHz]
940
941・INTLVL_TIMER
942  タイマの割込みレベル
943  
944   【MPC860T固有】
945     SIUの内
946部レベルを表す
947
948・TIC_NUME
949・TIC_DENO
950  タイマ割込みによりisig_tim()が呼び出される周期[msec]
951  それぞれ分子、分母を表す。
952  config.txtの
953   (3) タイムティックの定義
954  を参ç…
955§
956
957・INTLVL_SERIAL
958  シリアルの割込みレベル
959
960   【MPC860T固有】
961     シリアルの割込みレベルだけ個別に設定できず、
962     CPM_INT_LEVEL(後述)によって決定する。
963
964・BAUD_RATE
965  シリアル通信のボーレート
966  9600, 19200, 38400[bps]等の数値で定義する。
967
968・シリアルポート数の定義
969  ・TNUM_PORT
970    GDICレベルでサポートするシリアルポートの数
971    (カーネルの管理下にあるポート数)
972  ・TNUM_SIOP
973    PDICレベルでサポートするシリアルポートの数
974    (デバイスドライバ・レベルのポート数)
975  ・LOGTASK_PORTID
976    システムログに用いるシリアルポート番号
977
978
9796.2.2.1 オリジナルのPowerPCアーキテクチャ固有の設定項
980目
981
982(1) 条件コンパイル用のフラグとして用いるマクロ
983
984・SUPPORT_FLOATING_POINT_REG
985  プロセッサが浮動小数点レジスタを備えている。
986  ディスパッチャで浮動小数点レジスタの待
987避/復å…
988ƒã‚’行う。
989
990  (移植に用いたMPC860Tが浮動小数点レジスタを備えていないため)
991  このオプションは実機テストを行っていない。
992  また、本来は8バイト・アライメントに合わせるべきだが、この点も対応で
993  きていない。
994 
995  割込みルーチン、CPU例外ルーチンおよびタスク例外処理ルーチン内
996で
997  浮動小数点レジスタを使用する場合は、各ルーチン側で浮動小数点
998  レジスタの待
999避/復å…
1000ƒã‚’行うこと。
1001
1002・IMPLEMENT_EXCEPTION_00A00
1003  インプリメンテーション固有の例外0x00a00を使用する。
1004  処理内
1005容の実体は0xa番目のCPU例外ハンドラとして登録すること。
1006 
1007 備考
1008  ・CPU例外番号0xaはマクロEXC_NO_IMPLEMENT_EXCEPTION_00A00
1009   として、定義してある。
1010  ・登録したCPU例外ハンドラ内
1011では、通常のCPU例外ハンドラと
1012   同様にカーネルの機能を利用することができる。
1013
10146.2.2.2 The IBM PowerPC Embedded Environmentアーキテクチャ固有の設定項
1015目
1016 詳細は「7.5.6 IBM系PowerPC対応について」の項
1017を参ç…
1018§
1019
1020(1) 条件コンパイル用のフラグとして用いるマクロ
1021 ・SUPPORT_IBM_PPC_EMB_APU
1022   APUがデバイスに実装
1023されていることを示す。
1024   (APU:Auxiliary Processor Unit)
1025
1026(2) 値を設定するマクロ
1027 ・NUM_IMPLEMENT_EXCEPTION
1028  インプリメンテーション固有に定義された例外処理の本数
1029  (カーネルに登録するC言語ルーチンの本数)
1030
10316.2.2.3 MPC860T固有の設定項
1032目
1033
1034(1) 条件コンパイル用のフラグとして用いるマクロ
1035 ・SIL_DEBUG
1036   SILを使用したときのログ機能を有効にする(デバッグ用)
1037   å…
1038·ä½“的にはSILを経由したデバイスへのアクセスログを低レベル文字出
1039   力ルーチンsys_putc()を介してメモリ上の専用のエリアに記録する。
1040   BOOL型のグローバル変数sil_debug_onをTRUEに設定した時点からSILの
1041   アクセスログ機能が有効になる。(sil_mpc860.hをインクルードすると
1042   sil_debug_onがextern宣言される。)
1043   
1044   SILのログ機能は内
1045部でカーネル標準のログ機能を使用しているため、
1046   本ログ機能の出力をどの重要度の出力に割り当てるかは注意が必
1047要であ
1048   る。(user.txtの「4.4 ログ情
1049報の重要度」参ç…
1050§ï¼‰
1051   例えば、重要度LOG_EMERGをSILのログ出力に割り当てる場合、サンプル
1052   プログラムの設定では重要度LOG_EMERGは割込み駆動のシリアル出力と
1053   低レベル文字出力の両方に出力する設定になっているので、この目的で
1054   使う場合には適さない。(ログ出力時にさらにログが発生し、ログ出力
1055   が止まらなくなる。)本機能を有効にした場合は下記のようにSILのログ
1056   機能を割り当てた重要度のログを割込み駆動でシリアル出力しなくなる
1057   ような設定を推奨する。
1058   
1059   設定例:SILのログ機能を重要度 LOG_EMERGに割り当てた場合
1060    vmsk_log(LOG_UPTO(LOG_INFO) & ~LOG_MASK(LOG_EMERG),
1061         LOG_UPTO(LOG_EMERG));
1062   
1063   タイマドライバ内
1064で用いるとシステムの負荷が高くなり、タスクがほと
1065   んど動作しなくなるので注意
1066
1067(2) 値を設定するマクロ
1068 ・CPM_INT_LEVEL
1069   CPMからSIUへの割込み要求レベル
1070   シリアルSMC1の割込み要求レベルもこれと同じ扱いになる
1071
1072
10736.3 定義済みマクロ
1074
1075アセンブラで用いる疑似命令として、にtool_config.hで以下のマクロを
1076用意している。
1077
1078LI32(reg, imm) :32ビット即値ロード
1079 汎用レジスタregに32ビットの即値immをロードする。
1080 
1081 備考
1082  擬似命令liは16ビット即値のロードである。
1083 
1084LOAD_VAL32(reg, val):32ビット変数ロード
1085 汎用レジスタregに変数valの値をロードする。
1086
1087以下のルーチンはThe IBM PowerPC Embedded Environmentアーキテクチャにお
1088けるDCR(Device Control Register)アクセス用にvea_oea_emb.h内
1089で定義さ
1090れている。これらはデバイスドライバで使用されることを想定している。
1091
1092sil_rew_dcr(reg, val):DCRの現在値の読出し
1093 reg:レジスタ番号(整数定数)
1094 val:読み出した値を格納する変数(UW型)
1095
1096sil_wrw_dcr(reg, val):DCRの現在値の変更
1097 reg:レジスタ番号(整数定数)
1098 val:設定する値が格納された変数(UW型)
1099
1100---------------------------------------------------------------------
1101
11027. カーネル移植者
1103向けの情
1104å ±
1105
1106ここからは、本カーネルを他ののPowerPC32アーキテクチャ・プロセッサへ移
1107植するための情
1108報についてまとめる。
1109
1110
11117.1 用語定義
1112 ・ICU:Interrup Control Unit
1113     割込みコントローラ
1114 ・IPM:Interrupt Priority Mask
1115     ICUの割込みマスク
1116 ・インプリメンテーション依存性
1117     以下、PowerPC系プロセッサでそのプロセッサ固有の部分を
1118     インプリメンテーション依存性と呼ぶ。
1119
11207.2 レジスタの割り当て
1121
1122PowerPCのEABI(※)により規定されるレジスタ割り当て
1123 r0:zeroまたは汎用レジスタ
1124 r1:スタックポインタ
1125 r2:TOC(Table of Contents)
1126    基本的にC言語をコンパイルしたコードでは使用されない。
1127    å…
1128ƒã€…
1129UNIXのプロセス切替で使用されていた名残
1130    JSPカーネルではこのレジスタを使用していない。
1131    (割込みや例外処理で待
1132避/復å…
1133ƒã‚’行っていない。)
1134 r3-4:引数、戻り値
1135 r5-10:引数
1136 r13:small data(.sdataセクションのアドレス)
1137 r14-30:ローカル変数
1138 r31:ローカル変数またはenvironment pointer
1139 
1140 ※ PowerPC Embedded Application Binary Interface (EABI)として
1141   PowerPCアーキテクチャ陣営が規定している。
1142 
1143
1144JSPカーネルPowerPC依存部で決めたレジスタ割り当て
1145 SPRG0:割込み/CPU例外ネストカウンタ
1146 SPRG1:int_table 擬似割込みベクタのå…
1147ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
1148 SPRG2:exc_table 擬似CPU例外ベクタのå…
1149ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
1150
1151
1152【MPC860T固有】
1153 SPRG3:ipm_table 割込みハンドラ番号とIPMを対応付けるテーブルのå…
1154ˆé ­
1155          アドレス
1156
11577.3 OSの状æ…
1158‹åˆ¤åˆ¥ã®å®Ÿè£…
1159方針
1160
1161 コンテキスト
1162  SPRG0レジスタを割込み/CPU例外ネストカウンタとして割り当てており、
1163  タスクコンテキスト/非タスクコンテキストの判別を行っている。
1164
1165 CPUロック状æ…
1166‹
1167  マスタ・ステータス・レジスタMSRのEEビットでCPUロック状æ…
1168‹ã‚’
1169  表現している。
1170   EE=0:CPUロック状æ…
1171‹
1172   EE=1:CPUロック解除状æ…
1173‹
1174
11757.4 ディレクトリ構成
1176 $CPU=powerpc32ディレクトリ
1177   PowerPCå…
1178±é€šéƒ¨
1179    PowerPCアーキテクチャによって規定されている範囲内
1180で
1181    実装
1182できる部分
1183    すべてのPowerPC系プロセッサでå…
1184±é€šã«ä½¿ç”¨ã§ãã‚‹ã€‚
1185    
1186 $SYSディレクトリ
1187   従来のボード依存部(システム依存部)
1188   割込みコントローラ依存
1189   タイマドライバ
1190   シリアルドライバ
1191   
1192PowerPCアーキテクチャでは割込みコントローラは規定されておらず、各プロ
1193セッサ毎に異なる割込みコントローラがインプリメントされている。そして、
1194すべての外部割込みは同じ割込みベクタ(オフセット0x500)に分岐する。
1195PowerPC32依存部ではインプリメンテーション依存(主に割込みコントローラ
1196依存)の処理を$SYSディレクトリに分離している。これにより、他の
1197PowerPC32アーキテクチャのプロセッサの場合も、割込みコントローラ依存部
1198を記述するだけで本カーネルを移植することができる。(当然ながら、移植に
1199かかる工数は割り込みコントローラのアーキテクチャに大きく依存する。)
1200以下にPowerPC32アーキテクチャå…
1201±é€šéƒ¨ã¨ã‚¤ãƒ³ãƒ—リメンテーション依存部のイ
1202ンタフェースを述べる。
1203
12047.5 PowerPCå…
1205±é€šéƒ¨ã¨$SYSディレクトリ間のインターフェース
1206 「定義ファイル:sys_config.h」という記述はそのマクロを
1207 sys_config.hまたはsys_config.hからインクルードされるヘッダー
1208 ファイル内
1209で定義することを意味する。
1210
12117.5.1 PowerPCコアに関する定義
1212
1213INIT_MSRマクロ:MSRの初期値(オプション)
1214 リセット直後の初期値のままでよい場合は定義しなくてもよい
1215 定義ファイル:sys_config.h
1216
1217
12187.5.2 割込みコントローラ依存の定義
1219
1220(1) TMAX_INTNOマクロ:割込みコントローラが識別できる割込み要因の数
1221 例えば、シリアル通信の受信割込みと送信割込みが同じ割込みチャネルを
1222 å…
1223±æœ‰ã—ている場合、割込み要因としては1つと数える。
1224 定義ファイル:sys_config.h
1225
1226(2) IPM:割込みマスクのデータ型
1227 単なるマクロ定義ではなくtypedefを使って定義する。
1228 定義ファイル:sys_defs.h
1229
1230(3) PUSH_ICU_IPMマクロ:割込みコントローラの割込みマスクの待
1231避
1232
1233【機能】
1234 割込みコントローラの割込みマスクを、スタックへ保存する。
1235 アセンブラ命令で記述し、割込みのå…
1236¥å£å‡¦ç†ã§ä½¿ç”¨ã™ã‚‹ã€‚
1237
1238【備考】
1239 外部に割込みコントローラを利用しないシステムでは、空で定義すること。
1240 r1,r13〜r31を破壊してはいけない。
1241 IPMのデータサイズの如何によらず、この処理の前後でスタックポインタは
1242 4バイト境界を守ること。
1243 また、PUSH_ICU_IPMマクロとPOP_ICU_IPMマクロが対で実行された場合はス
1244 タックポインタが復å…
1245ƒã•ã‚Œã‚‹ã“と。
1246 定義ファイル:sys_config.h
1247
1248(4) POP_ICU_IPMマクロ:割込みコントローラの割込みマスクの復å…
1249ƒ
1250
1251【機能】
1252 割込みコントローラの割込みマスクを、スタックから復å…
1253ƒã™ã‚‹ã€‚
1254 アセンブラ命令で記述し、割込みの出口処理で使用する。
1255
1256【備考】
1257 外部に割込みコントローラを利用しないシステムでは、空で定義すること。
1258 r1,r13〜r31を破壊してはいけない。
1259 IPMのデータサイズの如何によらず、この処理の前後でスタックポインタは
1260 4バイト境界を守ること。
1261 また、PUSH_ICU_IPMマクロとPOP_ICU_IPMマクロが対で実行された場合はス
1262 タックポインタが復å…
1263ƒã•ã‚Œã‚‹ã“と。
1264 定義ファイル:sys_config.h
1265
1266(5) PROC_ICU(label)マクロ:割込み処理のICU依存部分
1267
1268【パラメータ】
1269 label シンボル識別用マクロ
1270
1271【機能】
1272 割込み要因を判断し、適切な割込みハンドラを呼び出す。
1273 アセンブラ命令で記述する。
1274 定義ファイル:sys_config.h
1275 
1276 
1277 このマクロはcpu_support.Sの割込み処理の中で、PowerPCコアの汎用レジス
1278 タの一部(r0,r3〜r12)、特殊レジスタ、割込みコントローラのIPMの退避、
1279 スタック切替えが済んだ状æ…
1280‹ã§å‘¼ã°ã‚Œã€ä»¥ä¸‹ã®å‡¦ç†ã‚’行う。
1281
1282  呼び出されるときの前提条件
1283   以下の処理が済んだ状æ…
1284‹ã§å‘¼ã°ã‚Œã‚‹
1285    ・レジスタの退避
1286     ・汎用レジスタの一部 r0,r3〜r12
1287     ・特殊レジスタ SRR0、SRR1、LR、CTR、CR、XER
1288     ・割込みコントローラのIPM
1289    ・スタック切替え
1290      コンテキスト(タスク/非タスク)の管理
1291  
1292  処理内
1293容
1294   ・割込み要因の判別
1295   ・割込みマスクの設定
1296   ・割込み許可
1297   ・C言語ルーチン呼び出し
1298    (割込みハンドラ未登録の場合はデフォルトのエラー処理)
1299   ・割込み禁止
1300   ・(必
1301要であれば)割り込み要求フラグのクリア
1302
1303 割込み擬似ベクタテーブルint_table[]はPowerPCå…
1304±é€šéƒ¨ã§å®šç¾©ã•ã‚Œã¦ãŠã‚Šã€
1305 そのå…
1306ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯SPRG1に格納されている。
1307 (「7.2 レジスタの割り当て」参ç…
1308§ã€ï¼‰
1309 
1310 静的API DEF_IHNで定義された割込みハンドラについては、C言語ルーチンの
1311 å…
1312ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’割込み擬似ベクタテーブルに登録する処理が起動時にå…
1313±é€šéƒ¨
1314 から呼び出されるため(*1)、PROC_ICUマクロではテーブルの内
1315容は初期化済
1316 みとして利用して良い。
1317  (*1) jsp/kernel/interrupt.cのinterrupt_initialize()参ç…
1318§
1319 
1320 PROC_ICUマクロでは割込みハンドラ番号をインデックスとして割込み擬似ベ
1321 クタテーブルからC言語ルーチンのå…
1322ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’4バイトデータとして取り
1323 出すことができる。
1324 å…
1325·ä½“的には以下の番地を参ç…
1326§ã™ã‚Œã°è‰¯ã„。
1327   int_tableのå…
1328ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ï¼‹ï¼ˆå‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ç•ªå·Ã—4)
1329
1330 実際の割込み要因と割込みハンドラ番号の対応関係はインリプメンテーショ
1331 ン依存部で定義し、ユーザー向けのドキュメントに明記すること。
1332  PROC_ICUマクロでは、C言語ルーチンを呼び出す前に要求された割込みに
1333 対する割込みハンドラが登録されているかチェックし、未登録の場合はデ
1334 フォルトのエラー処理を行う。(そうしないと0番地に分岐してしまう。)
1335
1336 割込みハンドラが登録されていない割込みについてはスタートアップルーチ
1337 ンで割込み擬似ベクタテーブルが0で初期化されてる。そのため、擬似ベク
1338 タテーブルを参ç…
1339§ã™ã‚Œã°ã€å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã®ç™»éŒ²ï¼æœªç™»éŒ²ã®åˆ¤åˆ¥ã‚’行うこと
1340 ができる。
1341 (MPC860T版では専用の関数を呼び出し、SIU割込み/CPM割込みの区分およ
1342  び割込み番号をログ出力している。)
1343
1344 このマクロは初段の割込みと多重割込みの場合の2ヶ所で展開される。
1345 マクロ内
1346部で分岐命令を使用する場合、そのままでは2ヶ所に展開されたマ
1347 クロでシンボル名が衝突し、それぞれの分岐å…
1348ˆã‚’識別できなくなる恐れがあ
1349 る。この問題を回避するため、PowerPCå…
1350±é€šéƒ¨ã‹ã‚‰ã¯å±•é–‹ã™ã‚‹å ´æ‰€ã”とに異
1351 なるマクロ引数labelが渡される。これを展開å…
1352ˆã®ã‚·ãƒ³ãƒœãƒ«åã®ä¸€éƒ¨ã«ç”¨ã„
1353 ることによって2ヶ所の展開å…
1354ˆã§ã‚·ãƒ³ãƒœãƒ«åã®è¡çªã‚’防ぐことができる。
1355
1356【備考】
1357 r1,r2,r13〜r31を破壊してはいけない。
1358 (スタックポインタはこのマクロ終了時にå…
1359ƒã®å€¤ã«å¾©å…
1360ƒã•ã‚Œã¦ã„ればOK)
1361 PROC_ICU内
1362でスタック上にデータを積む場合、以下の点に注意する必
1363要があ
1364 る。(このマクロは割込みコントローラのIPMが退避された状æ…
1365‹ã§å®Ÿè¡Œã•ã‚Œ
1366 るため、それ以外のデータをインプリメンテーション依存にスタックに退避
1367 しないのであれば、該当しない。)
1368
1369 C言語ルーチンを呼び出す際にPowerPCのコーリング・コンベンションにより
1370 (sp+4)〜(sp+7)番地はデータが書き込まれるので、スタック上にこの領域の
1371 データが破壊される。
1372 (「7.6 実装
1373上の注意」を参ç…
1374§ï¼‰
1375
1376 例えば、MPC860TではC言語ルーチンから戻ってきた後に割込み要求をクリア
1377 するために割込み番号を(MPC860T依存部独自に)スタックに積んでいるた
1378 め、注意が必
1379要なケースに該当する。この割込み番号をスタックに積むとき
1380 に上記の予約領域を空けるようにé…
1381ç½®ã—ている。
1382 
1383 スタック上に確保すべきマージンのサイズはcpu_config.hにマクロ
1384 STACK_MARGINとして定義している。
1385 
1386 備考
1387  64ビット化の際には注意が必
1388要である。
1389
1390【仕様決定の理由】
1391 PROC_ICUマクロ内
1392の各処理内
1393容を個別に定義してPowerPCå…
1394±é€šéƒ¨ã‹ã‚‰é©å®œå‘¼
1395 び出し、C言語ルーチンの呼び出しはPowerPCå…
1396±é€šéƒ¨ã§è¡Œã†æ–¹æ³•ã‚‚考えられ
1397 るが、ICUのアーキテクチャが複雑な場合(例:複数のICUのカスケード接続
1398 されている場合)、割込み要求のクリアを効率的な形で実装
1399できないため、
1400 すべての処理を$SYSディレクトリで定義する実装
1401方針とした。
1402
1403
1404(6) define_ipm:割込み受付時のIPMの定義(オプション)
1405
1406【C言語API】
1407 void define_ipm(INHNO inhno, IPM ipm);
1408
1409【パラメータ】
1410 INHNO inhno 割込みハンドラ番号
1411 IPM ipm 割込み受付時に設定するIPMの値
1412
1413【リターンパラメータ】
1414 なし
1415
1416【機能】
1417 割込みハンドラ番号inhnoの割込みを受け付けたときに割込みコントローラ
1418 のIPMに設定する値を定義する。
1419 
1420【備考】
1421 割込みコントローラが多重割込みのレベル制御をハードウェアでサポートし
1422 ていれば、ソフトウェアでこのような準備をする必
1423要はない。
1424 このマクロはデバイスドライバの初期化処理で使用されることを想定してい
1425 る。
1426
1427 同じ理由でipm_talbe[]も必
1428須ではなく、$CPUディレクトリとのインター
1429 フェースには含まれていない。
1430 (define_ipm()とPROC_ICUによって、ipm_talbe[]はPowerPCå…
1431±é€šéƒ¨ã‹ã‚‰éš è”½
1432  されている。)
1433
1434
1435以下の3つのマクロはSUPPORT_CHG_IPMが定義されている場合のみ必
1436要となる。
1437
1438
1439(7) CHECK_IPMマクロ:IPMの範囲チェック
1440
1441【C言語API】
1442 CHECK_IPM(IPM ipm);
1443
1444【パラメータ】
1445 IPM ipm チェックすべきIPMの値
1446
1447【機能】
1448 chg_ipm()においてipmの範囲チェックを行う。
1449 C言語で記述する。
1450 ipmの値が不正ならば、ercdにE_PARを代å…
1451¥ã—てchg_ipm()内
1452のラベルexitへ
1453 ジャンプする。
1454 å…
1455·ä½“的には以下の記述と同等の処理を行う。
1456 
1457 if (ipmの値が不正) {
1458 ercd = E_PAR;
1459 goto exit;
1460 }
1461 
1462 定義ファイル:sys_config.h
1463 
1464(8) CHG_IPMマクロ:IPMの変更
1465【C言語API】
1466 CHG_IPM(IPM ipm);
1467
1468【パラメータ】
1469 IPM ipm 設定するIPMの値
1470
1471【機能】
1472 chg_ipm()においてipmを割込みコントローラの割込みマスクに書き込む。
1473 C言語で記述する。
1474 定義ファイル:sys_config.h
1475
1476(9) GET_IPMマクロ:IPMの取得
1477【C言語API】
1478 GET_IPM(IPM *p_ipm);
1479
1480【パラメータ】
1481 IPM *p_ipm IPMを格納する領域へのポインタ
1482
1483【機能】
1484 get_ipm()において割込みコントローラの割込みマスクを読み出し、p_ipmが
1485 指し示す領域に書き込む。
1486 C言語で記述する。
1487 定義ファイル:sys_config.h
1488
14897.5.3 デバイスドライバ関連
1490 jsp-1.4からデバイスドライバは「ITRONデバイスドライバ設計ガイドライ
1491 ン」に準拠して作成されている。
1492 「ITRONデバイスドライバ設計ガイドライン」は下記のURLからダウンロード
1493 できる。
1494  http://www.ertl.jp/ITRON/GUIDE/device-j.html
1495  
1496 SIL(System Interface Layer)、PDIC(Primitive Device Interface
1497 Compornet)、GDIC(General Device Interface Compornet)等の用語は
1498 「ITRONデバイスドライバ設計ガイドライン」を参ç…
1499§ã€‚
1500 簡単に述べるとPDICは従来のhw_timer.h、hw_serial.hから
1501  ・割込みコントローラ依存
1502  ・CPU依存
1503  ・ボード依存
1504 を除いたデバイス依存部分に対応し、GDICはその上位レイヤにあたるå…
1505±é€šéƒ¨
1506 のserial.cに対応する。
1507
1508【MPC860T固有】
1509 MPC860T依存部では実際のデバイスドライバでよく使うアクセス関数を
1510 sil_mpc860t.hで定義しているので、デバイスドライバを自作する場合は
1511 これを用いても良い。
1512 (デバイス設計ガイドラインでは基本的なリード/ライトのアクセス関数
1513 のみ定義している。)
1514
1515
1516カーネルを動作させるのに最低限必
1517要なデバイスドライバ関連の項
1518目を以下
1519に示す。
1520
1521(1) SIL_ENDIANマクロ:プロセッサのエンディアンの定義
1522 定義ファイル:user_config.h
1523 ビッグエンディアンの場合:SIL_ENDIAN_BIG
1524 リトルエンディアンの場合:SIL_ENDIAN_LITTLE
1525  
1526(2) タイマ・ドライバ
1527 hw_timer.hとそこから呼び出されるPDICを$SYSディレクトリで用意する。
1528 詳しくはjsp/doc/config.txtを参ç…
1529§
1530  
1531(3) シリアル・ドライバ
1532 hw_serial.hとそこから呼び出されるPDICおよび割込みハンドラのコンフィ
1533 ギュレーション・ファイルhw_serial.cfgを$SYSディレクトリで用意する。
1534 シリアルデバイスが外付けデバイスで、PDICを他のマイコンでも流用できる
1535 場合、PDICをjsp/pdic/simple_sioディレクトリにé…
1536ç½®ã™ã‚‹ã€‚
1537 詳しくはjsp/doc/config.txtを参ç…
1538§
1539
1540
15417.5.4 オプション扱いのマクロ定義
1542
1543以下のマクロ定義はオプションである。
1544
1545(1) SAVE_POWPERマクロ
1546 ディスパッチャ本体で実行可能なタスクがないときにプロセッサを省電力
1547 モードに移行させる処理
1548 アセンブラ命令で記述する。
1549 ・割込みから戻ってきた後に割込み禁止も行う
1550 ・r0〜r4の内
1551容を破壊してはならない
1552
1553【備考】
1554 SUPPORT_POWER_MANAGEMENTマクロが定義されている場合のみ有効となる。
1555 定義ファイル:sys_config.h
1556
1557【注意】
1558  「割込み許可」と「省電力モードへの移行」をアトミックに行えないプ
1559  ロセッサでは、割込みのタイミングによっては「割込み許可」と「省電
1560  力モードへの移行」の間で割込みを受け付けてしまい、意図しない形で
1561  省電力モードに移行してしまうので注意。
1562  割込みによって実行可能なタスクが現れてもプロセッサがスリープした
1563  ままで実行されなくなる。(実際にはタイマ割込みにより省電力モード
1564  から復帰するので、タスクが待
1565たされる時間は最大でもタイマ割込み周
1566  期で押さえられる。)
1567
1568(2) トレースログの設定(オプションだが、空の定義ファイルは必
1569要)
1570 å…
1571ƒã€…
1572、tool_config.h内
1573で定義されていたマクロの内
1574、割込みコントローラや
1575 浮動点小数点演算ユニットに依存する下記のマクロを$SYSディレクトリの
1576 sys_tool_config.hに分離する。このマクロ定義自体はオプションであるが、
1577 sys_tool_config.hファイル自体は空でも用意する必
1578要がある。
1579 定義ファイル:sys_tool_config.h
1580
1581   LOG_INH_ENTER(inhno)
1582   LOG_INH_LEAVE(inhno)
1583   LOG_ISR_ENTER(intno)
1584   LOG_ISR_LEAVE(intno)
1585
1586   LOG_CHG_IPM_ENTER(ipm)
1587   LOG_CHG_IPM_LEAVE(ercd) /* 念のため、分離している */
1588   LOG_GET_IPM_ENTER(p_ipm)
1589   LOG_GET_IPM_LEAVE(ercd, ipm)
1590
1591   LOG_DSP_ENTER(tcb)
1592   LOG_DSP_LEAVE(tcb)
1593
15947.5.5 Makefile関連
1595
1596$SYS/Makefile.configで定義が必
1597要な項
1598目を以下に述べる。
1599
1600(1) ターゲット名(コンパイラ名)
1601 powerpc-elf-gcc以外のコンパイラを用いる場合は変数TARGETを定義する。
1602 定義されていない場合は、デフォルトでTARGETにpowerpc-eabi-elfが設定さ
1603 れる。
1604
1605(2) コンパイルオプション
1606 特にデバッグ情
1607報のオプションはgccのバージョンや使用するデバッグツー
1608 ルに依存するので、変数COPTSで定義する。
1609  
1610(3) リンク対象となるオブジェクトファイル
1611 $SYSディレクトリにソースファイルがあるものについては変数
1612 KERNEL_ASMOBJS(アセンブラ)、KERNEL_COBJS(C言語)にオブジェクト
1613 ファイル名を定義する。
1614 
1615(4) リンクスクリプト
1616 変数LDSCRIPTでファイル名を指定する。
1617
1618(5) textおよびdataセクションのå…
1619ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
1620 リンクスクリプトに記述しても良い。
1621
1622----------------------------------------------------------------------
16237.5.6 IBM系PowerPC対応について
1624
1625PowerPCアーキテクチャは大きく分けて、以下の2つに分類される。
1626 (1) オリジナルのPowerPCアーキテクチャ
1627   ・モトローラ MPCファミリ
1628   ・IBM PowerPC6xx/700ファミリ
1629 (2) The IBM PowerPC Embedded Environmentアーキテクチャ
1630   ・IBM PowerPC40xファミリ
1631 (3) The PowerPC Book-Eアーキテクチャ
1632  (the Enhanced PowerPCアーキテクチャ)
1633   ・IBM PowerPC440ファミリ
1634
1635また、PowerPCアーキテクチャの定義はアプリケーションレベルか
1636らカーネル・レベルまで3つのレベル分けがされており、上記3つの
1637アーキテクチャを比較するとUISAはå…
1638±é€šã ãŒã€VEAとOEAは異なる定
1639義になっている。
1640 ・UISA:User Instruction Set Architechture
1641   ・ユーザー命令セットアーキテクチャ
1642     ・ユーザーレベル命令セット
1643     ・ユーザーレベル・レジスタ
1644     ・データタイプ
1645     ・アドレッシング・モード
1646 ・VEA: Virtual Environment Architechture
1647   ・仮想環境アーキテクチャ
1648     ・メモリモデル
1649       キャッシュを含む
1650 ・OEA: Opareting Environment Architechture
1651   ・動作環境アーキテクチャ
1652     ・メモリ管理
1653     ・スーパーバイザ・レベル・レジスタ
1654     ・例外モデル
1655
1656本実装
1657では(1),(2)のアーキテクチャに対応できるようになっており、
1658両者
1659の切り替えはIBM_PPC_EMB_ENVマクロの定義の有無によって
1660条件コンパイルを行っている。
1661また、両者
1662の違いを吸収するため、VEAとOEAに関する記述は各アー
1663キテクチャ毎にヘッダーファイルを分けている。
1664  ・vea_oea.h:オリジナルのPowerPCアーキテクチャ用
1665  ・vea_oea_emb.h:The IBM PowerPC Embedded Environmentアーキテクチャ用
1666
1667なお、The PowerPC Book-Eアーキテクチャには未対応である。
1668このアーキテクチャへの移植を希望する方は相談されたい。
1669
1670以下、$SYSディレクトリで各アーキテクチャ毎に設定すべき内
1671容を述べる。
1672
1673(1) オリジナルのPowerPCアーキテクチャ固有の設定内
1674容
1675
1676IMPLEMENT_EXCEPTION_01000_PROCマクロ(オプション)
1677 インプリメンテーション固有の例外0x01000の処理内
1678容を定義したマクロ
1679 
1680 処理内
1681容はプロセッサのインプリメンテーション固有のものなので、
1682 カーネルによる出å…
1683¥å£å‡¦ç†ã¯æŒ¿å…
1684¥ã•ã‚Œãšã€ã“のマクロで定義した処理内
1685容が
1686 直接呼び出される。(つまり、カーネルの管理外扱い)
1687 そのため、この処理中でカーネルの機能を呼び出した場合の動作は未定義で
1688 ある。
1689 
1690 オフセット0x01000以降にé…
1691ç½®ã•ã‚Œã‚‹ä¾‹å¤–要因は1つとは限らない。2つ以上
1692 の例外ベクタがé…
1693ç½®ã•ã‚Œã‚‹å ´åˆã€ã‚ªãƒ•ã‚»ãƒƒãƒˆã®æŒ‡å®šæ–¹æ³•ã«æ³¨æ„ã™ã‚‹ã“と。
1694 å…
1695·ä½“的には
1696  .org オフセット - EXCEPTION_VECTOR_BASE
1697 のように指定する。詳しくはcpu_support.Sの該当個所を参ç…
1698§ã€‚
1699 
1700 定義ファイル:sys_config.h
1701
1702
1703(2) The IBM PowerPC Embedded Environmentアーキテクチャ固有の設定内
1704容
1705
1706A.マクロ
1707
1708A-1 条件コンパイル用マクロ
1709
1710  以下のマクロ定義は$SYS/Makefile.configの中でコンパイラ・
1711  オプションとして与える
1712
1713IBM_PPC_EMB_ENV
1714  このマクロが定義されている場合、The IBM PowerPC Embedded
1715  Environmentアーキテクチャであることを示す。
1716
1717A-2 例外処理ルーチンの定義
1718  設計方針
1719   基本的に以下の例外処理内
1720でサービスコールを使用する
1721   ケースは想定していない。(カーネル管理外扱い)
1722   例外処理ルーチン内
1723でサービスコールを呼び出したときの
1724   動作は保証されない。
1725  注意点1
1726   処理内
1727容はアセンブラで記述する。
1728   (C言語での記述を想定していないので、上記のような
1729    設計方針となる。)
1730  注意点2
1731   アーキテクチャ上、0x10バイトしか領域が割り当てられて
1732   いない例外要因については、分岐命令を使って別の場所に
1733   処理ルーチンをé…
1734ç½®ã™ã‚‹ã“と
1735  注意点3
1736   例外クラスがCriticalの例外処理では通常の例外と異なり、
1737   リターン命令はrfciを用いる。
1738   (rfci:Return From Critical Interrupt)
1739   以下の4つの例外要因が該当する。
1740    ・Critical Input
1741    ・Machine Check
1742    ・Watchdoc Timer
1743    ・Debug
1744
1745以下のマクロはいずれもsys_config.hまたはそこからインクルードされる
1746ヘッダーファイル内
1747で定義すること。
1748
1749以下の例外処理の定義は必
1750須である。
1751
1752CRITICAL_INTERRUPT_EXCEPTION_PROC
1753 Critical Interrupt例外の処理
1754 例外ベクタ0x100
1755 例外クラス:Critical
1756   通常の例外と異なり、リターン命令はrfciを用いる。
1757   (rfci:Return From Critical Interrupt)
1758 Critical Interruptはインプリメンテーション依存なので
1759 処理内
1760容はマクロ定義しておく。
1761 0x100バイトしか領域が割り当てられていないので注意
1762 この範囲を超
1763える場合は残りの部分を別の場所にé…
1764ç½®ã—て、
1765 そこに分岐すること
1766
1767  注意点1
1768    Critical Interruptはカーネル管理外の例外とする。
1769    (この処理ルーチン内
1770でサービスコールを使用しない。)
1771
1772MACHINE_CHECK_PROC
1773 Machine Check例外の処理
1774 例外ベクタ0x200
1775 例外クラス:Critical
1776   通常の例外と異なり、リターン命令はrfciを用いる。
1777   (rfci:Return From Critical Interrupt)
1778 0x100バイトしか領域が割り当てられていないので注意
1779 この範囲を超
1780える場合は残りの部分を別の場所にé…
1781ç½®ã—て、
1782 そこに分岐すること
1783
1784  注意点1
1785    Machine Checkはカーネル管理外の例外とする。
1786    (この処理ルーチン内
1787でサービスコールを使用しない。)
1788
1789PROGRAMMABLE_INTERVAL_TIMER_PROC
1790 Programmable Interval timer例外の処理
1791 例外ベクタ0x1000
1792 0x10バイトしか領域が割り当てられていないので注意
1793 この範囲を超
1794える場合は残りの部分を別の場所にé…
1795ç½®ã—て、
1796 そこに分岐すること
1797 (以下のマクロも同様)
1798
1799FIXED_INTERVAL_TIMER_PROC
1800 Fixed Interval timer例外の処理
1801 例外ベクタ0x1010
1802 0x10バイトしか領域が割り当てられていないので注意
1803
1804WATCHDOG_TIMER_PROC
1805 Watchdog timer例外の処理
1806 例外ベクタ0x1020
1807 例外クラス:Critical
1808   通常の例外と異なり、リターン命令はrfciを用いる。
1809   (rfci:Return From Critical Interrupt)
1810 0x10バイトしか領域が割り当てられていないので注意
1811
1812DATA_TLB_MISS_PROC
1813 Data TLB miss例外の処理
1814 例外ベクタ0x1100
1815 0x10バイトしか領域が割り当てられていないので注意
1816
1817INSTRUCTION_TLB_MISS_PROC
1818 Instruction TLB miss例外の処理
1819 例外ベクタ0x1200
1820 0x10バイトしか領域が割り当てられていないので注意
1821
1822DEBUG_PROC
1823 Debug例外の処理
1824 例外ベクタ0x2000
1825 0x10バイトしか領域が割り当てられていないので注意
1826 要因は以下の7種類
1827  Trap
1828  Instruction address compare
1829  Data address compare
1830  Instruction complete
1831  Branch taken
1832  Exception
1833  Unconditional debug event
1834
1835
1836以下の例外処理の定義はオプションである。
1837
1838IMPLEMENT_EXCEPTION_D00_PROC(オプション)
1839 インプリメンテーション専用の処理
1840  オフセット:0xd00-0xff0
1841 インプリメンテーション固有の例外ベクタ(1つとは限らない)や
1842 他の用途に使用される。
1843
1844   オフセットの指定方法に注意すること。
1845  å…
1846·ä½“的には
1847 .org オフセット - EXCEPTION_VECTOR_BASE
1848   のように指定する。詳しくは他の例外要因の該当個所を参ç…
1849§ã€‚
1850 例えば、PowerPC405ではオフセット0xf20に
1851 APU Unavailable例外の処理をé…
1852ç½®ã™ã‚‹ã€‚
1853
1854IMPLEMENT_EXCEPTION_02010_PROC(オプション)
1855 インプリメンテーション専用の処理
1856  オフセット:0x2010-0x2ff0
1857 インプリメンテーション固有の例外ベクタ(1つとは限らない)や
1858 他の用途に使用される
1859
1860   オフセットの指定方法に注意すること。
1861  å…
1862·ä½“的には
1863 .org オフセット - EXCEPTION_VECTOR_BASE
1864   のように指定する。詳しくは他の例外要因の該当個所を参ç…
1865§ã€‚
1866
1867
1868B.リンクスクリプト
1869
1870リセットベクタは0xffff,fffc番地に固定されている。
1871リセット処理用にreset_vectorセクションを定義している。
1872リンクスクリプトでこのセクションを0xffff,ffec番地
1873(0xffff,fffc - 4バイト×4命令)にé…
1874ç½®ã™ã‚‹ã€‚
1875詳しくはcpu_support.Sのリセットベクタの記述個所を参ç…
1876§
1877
1878備考
1879 EVPRレジスタの設定はメモリコントローラの初期化の後に行うべきなので
1880 デフォルトのスタートアップルーチンでは行わず、hardware_init_hook
1881 ルーチンで行う方法を標準とする。
1882
1883----------------------------------------------------------------------
1884
18857.6 実装
1886上の注意
1887
1888(1) hardware_init_hookの戻り番地について
1889 スタートアップルーチンでhardware_init_hookの戻り番地をリンクレジスタ
1890 LRに保存しているので、破壊してはいけない。
1891 (hardware_init_hookから戻るときにリンクレジスタLRを利用せずに直接ラ
1892 ベルstart_1にジャンプしてもOK)
1893
1894(2) アセンブラルーチンからのC言語ルーチン呼出しについて
1895 PowerPC EABIで規定されているコーリング・コンベンションでは関数呼び出
1896 し時のフレームスタックポインタが指している8バイトå…
1897ˆ(sp+4)〜(sp+7)番
1898 地に呼ばれた側の情
1899報が待
1900避される。そのため、アセンブラルーチンからC
1901 言語ルーチンを呼び出す箇所(特に割込みコントローラ依存部)では注意が
1902 必
1903要である。
1904 å…
1905·ä½“的には以下の箇所が該当する。
1906  (1) スタートアップルーチン
1907  (2) タスク起動
1908   (2-1) タスク例外処理ルーチン起動
1909  (3) 割込みハンドラ起動
1910  (4) CPU例外ルーチン起動
1911
1912            スタックが伸びる方向
1913                ↑
1914 関数呼び出し前のsp→ ----------------------
1915       | |
1916      +4 ---------------------- 
1917      | |←C言語ルーチンの呼び出し
1918      +8 ---------------------- により書き込まれる
1919
1920 スタック上に確保すべきマージンのサイズはcpu_config.hにマクロ
1921 STACK_MARGINとして定義している。
1922
1923
1924変更履歴
1925
19262004年10月9日 Release1.4.1
1927・改良
1928 + ユーザーが変更できる箇所をuser_config.hとして分離した。
1929
19302004年5月14日 
1931・改良
1932 + The IBM PowerPC Embedded Environmentアーキテクチャに関する
1933   記述を追加
1934    ・オリジナルのPowerPCアーキテクチャ
1935    ・The IBM PowerPC Embedded Environmentアーキテクチャ
1936   の両対応とするため、
1937    ・UISA:ユーザー命令セットアーキテクチャ
1938    ・VEA:仮想環境アーキテクチャ
1939    ・OEA:動作環境アーキテクチャ
1940   の各定義のファイル構成を見直し
1941
19422004年2月20日 JSPカーネル Release1.4 対応
1943 PowerPC32版のサポートを開始
Note: See TracBrowser for help on using the repository browser.