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

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

initial

File size: 51.8 KB
Line 
1
2 = TOPPERS/JSPカーネル ユーザズマニュアル =
3 (MIPS3 ターゲット依存部)
4
5 (Release 1.4.1 対応,最終更新: 9-Aug-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.MIPS3 ターゲット依存部の概要
55
561.1 ターゲットシステムと開発環境
57
58MIPS3プロセッサのターゲットシステムとしては、以下のプロセッサをサポートし
59ている。
60
61・VR5500 (NEC)
62・VR4131 (NEC)
63
64サポートしているボードは、以下の通りである。
65
66・株式会社マイダス・ラボ製 RTE-VR5500-CB(64) (CPU:VR5500)
67・京都マイクロコンピュータ株式会社製 KZ-Vr4131PCI-01 (CPU:VR4131)
68
69開発環境には、GCC などの GNU開発環境を用い、オブジェクトファイルフォーマッ
70トは ELF を標準とする。
71
72以下、vr5500, vr4131ディレクトリを除いたmips3ディレクトリの範囲をプロセッサ
73依存部と呼び、vr5500, vr4131ディレクトリに関することを、システム依存部と呼
74ぶ。
75 MIPS3ターゲット依存部 = プロセッサ依存部 + システム依存部
76
771.2 サポートする機能の概要
78
79MIPS3ターゲット依存の機能として、割込みマスクの変更・参ç…
80§(chg_ipm、get_ipm)
81と、性能評価用システム時刻参ç…
82§æ©Ÿèƒ½(vxget_tim)をサポートしている。割込みの
83禁止と許可(dis_int、ena_int)はサポートしていない。
84
851.3 他のターゲットへのポーティング
86
87MIPS シリーズは、MIPS 社から供給されている CPU コアであり、このコアを用いた
88様々
89なプロセッサが各メーカーから出荷されている。また、MIPS には、命令セット
90の拡張レベルに応じて MIPS I 〜 IV までが存在する。その中で、今回は MIPS III
91レベル(以下、MIPS3)の命令セットを用いた実装
92を行った。
93
94これは今回実装
95を行ったプロセッサに関して、VR5500 は命令セットとして MIPS IV
96まで対応しているが、VR4131 は MIPS III までの対応であるためである。
97(今回の実装
98を用いて、他のMIPSプロセッサへのポーティングを行うことが可能で
99 ある。)
100
1011.4 GDB スタブ
102
103現在の TOPPERS/JSP カーネル MIPS3 版はROM化をサポートしている。
104
105また、GDBスタブと組み合わせて使用することを考æ…
106®ã—て、他機種版のJSPカーネルと
107同様に、ソースコード内
108にGDB_STUBマクロによる条件コンパイルの設定を行っている。
109このマクロの設定により、使用するリンカスクリプトを切り替えることで、対応を
110行っている。
111(/vrxxxx/makefile.config)
112
113MIPS3用のGDBスタブは、vr4131限定対応版が、完成しており、今後TOPPERSプロジェ
114クトホームページ、および、宮城県産業技術総合センターホームページを通じて
115å…
116¬é–‹ã™ã‚‹äºˆå®šã§ã‚る。
117
1181.5 シリアルポート
119
120カーネルのログ出力用にシリアルポートを1つ使用する。
121シリアルポートの設定は
122 ・8ビット
123 ・パリティなし
124 ・ストップビット:1ビット
125 ・ボーレート:9600bps
126である。
127(tl16pir552.c, vr4131_dsiu.c;siopinib_tableé…
128åˆ—)
129
130なお、ボーレートについては、DEVIDE_RATIOマクロにて定義しているので必
131要に
132応じて変更することができる。
133(sys_config.h)
134
1352.MIPS3ターゲット依存部の機能
136
137この節では、カーネルおよびシステムサービスの機能の中で、MIPS3ターゲット依
138存の部分について解説する。
139
1402.1 データ型
141
142int型および unsigned int型のサイズは 32ビットである。
143現在は、MIPS自体は、64ビットアーキテクチャであるため、64ビットへの対応も
144可能である。しかし、現段階での利用実績などから、今回は32ビットでの実装
145を
146行った。
147
1482.2 割込み管理機能とCPU例外
149
150MIPS3では、割込みもCPU例外も一緒にし、「例外処理」という形で、処理を行って
151いる。そのため、メモリ管理・リセットなどの一部の致命的な例外を除き、ベク
152タアドレスはå…
153±é€šã¨ãªã£ã¦ã„る。
154
155(なお、今回の実装
156では、ROM化などの理由により、ステータスレジスタのBEVビッ
157トが1として実装
158を行っているので、ベクタアドレスは0xbfc00300になっている。)
159(sys_config.h ; INIT_SR)
160
161そこで、ベクタアドレスに飛んだ途中から、割込みとCPU例外(割込み以外の「例
162外」を、以下、このように呼ぶこととする。)とに分岐させて処理を行う必
163要が
164ある。そこで、原因レジスタ(Cause;CP0)の例外コード(ExcCode)を用いて判断を
165行って分岐している。
166
167判断後の、各要因に対応するハンドラを呼び出すために、擬似ベクタテーブルを
168設けている。
169 ・割込み INT_TABLE int_table[ TMAX_ALL_INTNO ]
170 ICU_IPM icu_intmask_table[ TMAX_ALL_INTNO ]
171 ・CPU例外 EXCVE exc_table[ TMAX_CORE_EXCNO ]
172ここで、割込みハンドラ擬似ベクタテーブルについては、MIPS3コアは、割込みの
173優å…
174ˆåº¦åˆ¶å¾¡ã‚’行わないために、割込みハンドラ呼び出し時のMIPS3コアに関する割
175込みマスクとをまとめたINT_TABLE型を定義し、é…
176åˆ—の型とした。また、割込み
177コントローラについては、様々
178な割込みコントローラが存在することを考æ…
179®ã—て、
180移植性の観点からプロセッサ依存部から分離させて、システム依存部において割
181込みコントローラ関連の実装
182を行う必
183要があるため、別にicu_intmask_tableé…
184
185列を定義することで対応することとした。
186(cpu_config.h, cpu_config.c, pic_icu.h, vr4131_icu.h)
187
188なお、ここで、
189 TMAX_ALL_INTNO : MIPS3コアと割込みコントローラとを含めた、割込み
190 の総本数
191 (MIPS3コア の総本数 TMAX_CORE_INTNO (8本固定)と、割込み
192 コントローラ管理下の総本数 TMAX_ICU_INTNO との合計。)
193 TMAX_CORE_EXCNO : MIPS3コア管理下の、CPU例外の総本数(32本固定)
194である。
195(mips3.h, cpu_config.h, pic_icu.h, vr4131_icu.h)
196
197ハンドラ擬似ベクタテーブルには、初期値として、デバック用にcpu_experr関数
198が登録されている。これは、引数として、割込み・CPU例外・TLB, XTLB不一致発
199生時のスタックポインタの値、ステータスレジスタの値、原因レジスタの値を持
200つ関数であり、それらの値をログ出力用のポートに書き出す関数である。
201(cpu_config.c)
202
203以下では、2.3〜2.4では割込みについて説明し、2.5ではCPU例外について説明を
204する。
205
206(MIPS3コアは、割込みコントローラを内
207蔵していないため、各ターゲットによっ
208て割込み処理が異なる。そこで、今回利用したターゲット以外に移植するための
209割込み処理に関するインタフェース情
210報は、この文書の最後にまとめて記載して
211いるので、参ç…
212§ã®ã“と。)
213
2142.3 割込み管理機能
215
2162.3.1 割込みコントローラICUとCPUとの接続
217
218MIPS3コアは、割込みコントローラを内
219蔵していないため、別に設ける必
220要がある。
221その割込みコントローラとの接続状況とを定義するために、INIT_CORE_IPM を定
222義する。この値は、mips3.hで定義しているCause_Int(0:4)マクロを利用して定義
223する。
224(なお、このマクロは、最終的にはCP0の原因レジスタのビットを直接定義している。)
225(sys_config.h)
226
227(a) VR5500
228VR5500は、割込みコントローラを内
229蔵していないために、ターゲットボード上に
230割込みコントローラを設けている。この割込みコントローラとは、外部割込み
231Int(0:1)の2本で接続されている。
232 INIT_CORE_IPM = ( Cause_Int0 | Cause_Int0 )
233
234(b) VR4131
235VR4131は、割込みコントローラを内
236蔵している。この割込みコントローラとは、
237外部割込みInt(0:2)の3本で接続されている。
238(ハードウェア編p196参ç…
239§ï¼‰
240 INIT_CORE_IPM = ( Cause_Int0 | Cause_Int1 | Cause_Int2 )
241
2422.3.2 割込みハンドラ
243
244割込みハンドラは、上記の擬似ベクタテーブルに登録をして利用することになる。
245このときの、テーブルを引くための引数である番号を「割込み要因番号」と呼ぶ。
246
2470 〜 7は、MIPS3コアの各割込み要因に対応しており、å…
248±é€šéƒ¨ã«ãŠã„て INTNO_IP0
249 〜 INTNO_IP7 として定義している。
250(mips3.h)
251
252また、8番以降を、システム依存部で以下のように定義している。
253
254(a) VR5500
255 割込み要因 | 割込み要因番号 | マクロ名
256 −−−−−−−−−−−−−−−−−−−−−−−−−−−−
257 タイマ0 | 8 | INTNO_TIMER0
258 −−−−−−−−−−−−−−−−−−−−−−−−−−−−
259 シリアル0 | 9 | INTNO_SERIAL0
260 −−−−−−−−−−−−−−−−−−−−−−−−−−−−
261 GBUS-INT0- | 10 | INTNO_GBUS
262 −−−−−−−−−−−−−−−−−−−−−−−−−−−−
263 BUS ERROR | 11 | INTNO_BUS_ERR
264 −−−−−−−−−−−−−−−−−−−−−−−−−−−−
265 タイマ1 | 12 | INTNO_TIMER1
266 −−−−−−−−−−−−−−−−−−−−−−−−−−−−
267 シリアル1 | 13 | INTNO_SERIAL1
268 −−−−−−−−−−−−−−−−−−−−−−−−−−−−
269 パラレル | 14 | INTNO_PARALEL
270 −−−−−−−−−−−−−−−−−−−−−−−−−−−−
271 DMAC INTREQ- | 15 | INTNO_DMAC
272
273(pic_icu.h)
274
275(b) VR4131
276 割込み要因 | 割込み要因番号 | マクロ名
277 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
278 バッテリ | 8 | INTNO_BAT
279 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
280 パワースイッチ | 9 | INTNO_POWER
281 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
282 RTCLong1 | 10 | INTNO_RTCL1
283 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
284 ElipsedTime タイマ | 11 | INTNO_ETIME
285 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
286 GIU | 12 | INTNO_GIU
287 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
288 SIU | 13 | INTNO_SIU
289 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
290 ソフトウェア | 14 | INTNO_SOFTINT
291 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
292 CLKRUN | 15 | INTNO_CLKRUN
293 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
294 RTCLong2 | 16 | INTNO_RTCL2
295 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
296 LED | 17 | INTNO_LED
297 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
298 TClockカウンタ | 18 | INTNO_TCLK
299 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
300 FIR | 19 | INTNO_FIR
301 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
302 DSIU | 20 | INTNO_DSIU
303 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
304 PCI | 21 | INTNO_PCI
305 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
306 SCU | 22 | INTNO_SCU
307 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
308 CSI | 23 | INTNO_CSI
309 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
310 BCU | 24 | INTNO_BCU
311
312(vr4131_icu.h)
313
314今回のターゲットにおいては、カーネルでは、以上の割込み要因の中から下記を
315利用している。
316
317(a) VR5500
318 タイマ0、シリアル0(、シリアル1)
319
320(b) VR4131
321 TClockカウンタ、DSIU
322
3232.3.3 割込みマスク/割込み優å…
324ˆåº¦åˆ¶å¾¡
325
326割込みマスク/割込み優å…
327ˆåº¦åˆ¶å¾¡ã®ãŸã‚ã®ã€å®šç¾©ãƒ»APIは以下の通りである。
328
329(1)IPM型
330CPUコアと割込みコントローラとをå…
331¨ã¦ã¾ã¨ã‚ãŸã€å‰²è¾¼ã¿ãƒžã‚¹ã‚¯ã‚’扱うための型で
332ある。CORE_IPM型coreとICU_IPM型icuとからなる構造体として定義している。
333(cpu_defs.h)
334
335CORE_IPM型は、ステータスレジスタに書込む値を保持するため、UINT型として定
336義している。また、ICU_IPM型は、それぞれにターゲットボードについて下記の
337ように定義している。
338
339(a) VR5500
340 VR5500は割込みコントローラを内
341蔵していないため、ターゲットボード上に割
342 込みコントローラを持っている。この割込みコントローラは、1バイト×2個
343 の割込みマスクを持っているので、ICU_IPM型は
344 { int0m, int1m } = { UB型, UB型 }
345 として定義している。
346
347(b) VR4131
348 VR4131は割込みコントローラを内
349蔵している。この内
350蔵割込みコントローラは、
351 2バイト×2個の割込みマスク(MSYSINT1REG, MSYSINTREG2REGレジスタ)を持っ
352 ているので、ICU_IPM型は
353 { msysint1, msysint2 } = { UH型, UH型 }
354 として定義している。
355
356(cpu_defs.h, sys_defs.h)
357
358今回の実装
359では、ICU_IPM 型の初期値として下記のようにしている。
360
361(a) VR5500
362 タイマ0のみを許可している。
363
364(b) VR4131
365 バッテリのみを許可している。
366
367(sys_config.h)
368
369(coreの値は、ステータスレジスタに書込む、IM(0:7)の部分のみを保持する
370 こと。他のビットも操作した場合の動作は、保証しない。)
371
372(2)all_set_ilv 割込みレベルの設定
373
374【C言語API】
375 all_set_ilv(INTNO intno, IPM *ipm)
376
377【パラメータ】
378 INTNO intno 割込み要因番号
379 IPM ipm 割込みマスク
380
381【リターンパラメータ】
382 なし
383
384【機能】
385MIPS3コアおよび割り込みコントローラに関する、割込みハンドラ擬似ベクタテー
386ブル(int_tableならびに、icu_intmask_table)に、割込みマスクを設定する。
387(cpu_config.h)
388
389なお、ターゲットボード上の割込みコントローラにもよるが、今回実装
390を行った
391ターゲットボードの割込みコントローラでは両方とも割込み優å…
392ˆåº¦åˆ¶å¾¡ã‚’行って
393いない。そのために、割込み優å…
394ˆåº¦å‡¦ç†ã‚’割込みマスクの設定で行う必
395要がある。
396
397この時、割込みマスクを設定するときは、IPM型構造体の要素であるCORE_IPM型
398coreは、そのターゲットボードのハードウェア構成を反映しているものであるの
399で、原則として変更しないこととする。割込みレベルの設定は、接続されている
400割込みコントローラの割込みマスクを変更することで対応することとする。
401
402今回の実装
403における、優å…
404ˆåº¦ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã‚る。
405(a) VR5500
406 優å…
407ˆåº¦ : (低) シリアル1 -> シリアル0 -> タイマ0 (高)
408(rte-vr5500-cb.h)
409(b) VR4131
410 優å…
411ˆåº¦ : (低) DSIU -> TClockカウンタ -> バッテリ残量不足検知 (高)
412(kz-vr4131pci-01.h)
413
4142.4 chg_ipmのサポートについて
415
416chg_ipm をサポートするために、割込みハンドラの出å…
417¥å£å‡¦ç†ãªã©ã«ã‚ªãƒ¼ãƒãƒ˜ãƒƒ
418ドを生じている。そこで、SUPPORT_CHG_IPM というマクロにより、これらのサー
419ビスコールをサポートするかどうかを切り替えられるようにしている。
420(SUPPORT_CHG_IPM は、cpu_config.h の中で #define されている。)
421
422MIPS3ターゲット依存の割込みマスクの変更・参ç…
423§ã®ãŸã‚ã®ã‚µãƒ¼ãƒ“スコールの仕様
424は次の通り。
425
426(1) chg_ipm 割込みマスクの変更
427
428【C言語API】
429 ER ercd = chg_ipm(IPM ipm);
430
431【パラメータ】
432 IPM ipm 設定すべき IPM の値
433
434【リターンパラメータ】
435 ER ercd エラーコード
436
437【エラーコード】
438 E_CTX コンテキストエラー
439 E_PAR パラメータエラー(ipm が不正)
440
441【機能】
442
443割込みマスクを ipm で指定された値に設定する。指定した値が、MIPS3コア部分
444については0〜MAX_IPMの範囲内
445に、割込みコントローラ部分については割込み
446コントローラの割込みマスクの範囲内
447にå…
448¥ã£ã¦ã„ない場合に、E_PARエラーを返
449す。また、設定したIPMの値は、ディスパッチ後も引き継がれる。
450ここで、MAX_IPMは、MIPS3コアに設定できる割込みマスクの最大のビットパター
451ンである。
452
453このサービスコールは、タスクコンテキストで CPUロック解除状æ…
454‹ã®æ™‚のみ呼
455び出すことができる。非タスクコンテキストや CPUロック状æ…
456‹ã§å‘¼ã³å‡ºã—た場
457合には、E_CTXエラーとなる。
458
459(2) get_ipm 割込みマスクの参ç…
460§
461
462【C言語API】
463 ER ercd = get_ipm(IPM *p_ipm);
464
465【パラメータ】
466 なし
467
468【リターンパラメータ】
469 ER ercd エラーコード
470 IPM ipm 現在の IPM の値
471
472【エラーコード】
473 E_CTX コンテキストエラー
474
475【機能】
476
477現在の 割込みマスクの値を読み出し、ipm に返す。
478
479このサービスコールは、タスクコンテキストで CPUロック解除状æ…
480‹ã®æ™‚のみ呼
481び出すことができる。非タスクコンテキストや CPUロック状æ…
482‹ã§å‘¼ã³å‡ºã—た場
483合には、E_CTXエラーとなる。
484
485なお、トレースログ機能に関して、chg_ipmに関する部分はシステム依存部にて
486定義を行っている。
487(sys_tool_config.h)
488
4892.5 CPU例外管理機能とCPU例外ハンドラ
490
491DEF_EXC で指定するCPU例外要因番号(excno)は、MIPS3 での擬似ベクタテーブル
492のベクタ番号を表し、そのデータ型(EXCNO)は UINT型に定義されている。例外
493要因番号はMIPS3の例外コードと1対1に対応している。
494
495DEF_EXC で、例外要因番号として有効でない値や、CPU例外に対応しない番号を
496指定した場合の動作は保証されない。
497
498(1)引数p_excinf
499CPU例外ハンドラに渡されるp_excinfは、CPU例外発生時のコンテキストを保存
500したスタックへのポインタが渡される。スタックの構造を以下に示す。
501
502 ----------------------
503 | sp (r29) | <-- p_excinf
504 ----------------------
505 | at (r1) |
506 ----------------------
507 | v0 (r2) |
508 ----------------------
509 | v1 (r3) |
510 ----------------------
511 | a0 (r4) |
512 ----------------------
513 | a1 (r5) |
514 ----------------------
515 | a2 (r6) |
516 ----------------------
517 | a3 (r7) |
518 ----------------------
519 | t0 (r8) |
520 ----------------------
521 | t1 (r9) |
522 ----------------------
523 | t2 (r10) |
524 ----------------------
525 | t3 (r11) |
526 ----------------------
527 | t4 (r12) |
528 ----------------------
529 | t5 (r13) |
530 ----------------------
531 | t6 (r14) |
532 ----------------------
533 | t7 (r15) |
534 ----------------------
535 | t8 (r24) |
536 ----------------------
537 | t9 (r25) |
538 ----------------------
539 | gp (r28) |
540 ----------------------
541 | fp (r30) |
542 ----------------------
543 | ra (r31) |
544 ----------------------
545 | PC (EPC;CP0_r14) |
546 ----------------------
547 | SR (Status;CP0_r12) |
548 ----------------------
549 | HI |
550 ----------------------
551 | LO |
552 ----------------------
553
554 sp : Stack Pointer
555 gp : Global Pointer
556 fp : Frame Pointer
557 ra : Return Address
558 PC : Program Counter
559 SR : Status Register
560
561また、CPU例外発生時のEPCの値は、例外発生命令が分岐スロットにある場合は、
562直前の分岐・ジャンプ命令をさす。
563(すなわち、対象命令のアドレス-4が書き込まれる。)
564
5652.6 HI, LO レジスタ
566
567MIPS3では、乗除算レジスタHI, LOをサポートしている。そこで、今回の実装
568にお
569いては、割込みハンドラの出å…
570¥å£å‡¦ç†ã§ã€ã‚¹ã‚¿ãƒƒã‚¯ã¸ä¿å­˜ã—ている。
571タスクコンテキスト内
572での、自らのディスパッチ呼び出しの場合は、関数呼び出
573しであり、この呼び出しをまたがってこのレジスタを利用することは無いので、
574保存していない。
575(cpu_support.S)
576
5772.7 スタートアップモジュール
578
579MIPS3ターゲットでは、例外ベクタの一つに、リセット並びに NMI(Non Maskable
580Interrupt)用のベクタアドレスを備えている。このアドレスからのジャンプå…
581ˆãŒ
582スタートアップモジュールとなっている。
583
584このスタートアップモジュール(reset.S)では、次の初期化処理を行う。
585
586(A) プロセッサの初期化
587
588プロセッサの初期化は、下記のものを行う。
589(a) CPUレジスタの初期化
590乗除算レジスタ、スタックポインタsp、グローバルポインタgp、k0レジスタを初期
591化する。
592
593スタックポインタには、アドレス _stack_top を設定する。_stack_top は、リンカ
594スクリプト内
595で定義するものとする。ここで設定されるスタック領域は、非タスク
596コンテキスト用のスタック領域として、割込みハンドラなどで利用される。
597(vrxxxxelf.ld)
598
599グローバルポインタには、アドレス _gp を設定する。_gp は、リンカスクリプト内
600
601で定義するものとする。
602(vrxxxxelf.ld)
603
604k0レジスタには、カーネル起動時は非タスクコンテキストでの実行とするので、1を
605設定する。
606
607(b) CP0レジスタの初期化
608ステータスレジスタ、コンフィグレジスタ、ウォッチLoレジスタ、比較レジスタを
609初期化する。
610
611ステータスレジスタを INIT_SR に初期化する。INIT_SR は、sys_config.h で定義
612することを想定している。このとき、ステータスレジスタ内
613の割込みマスクも設定
614する。この時、割り込みマスクを INIT_CORE_IPM (sys_config.h) の値に設定する。
615
616コンフィグレジスタを、INIT_CONFIG_MASK で初期化する。INIT_CONFIG_MASK は、
617sys_config.h で定義することを想定している。このマスク値とOR演算を行うことで、
618初期化を行っている。
619
620(B) hardware_init_hook の呼出し
621
622hardware_init_hook が 0 でない場合には、hardware_init_hook を呼び出す。
623hardware_init_hook は、一般にカーネルが起動される前に行う必
624要があるシステム
625依存の初期化(例:RAMコントローラの初期化など)を記述するものとする。
626記述場所は、sys_support.S を標準とする。
627
628hardware_init_hook がどこでも定義されていない場合、リンカでこのシンボルを0
629に定義する(リンカスクリプト内
630に記述あり)。
631
632なお、MIPS3アーキテクチャでは、一般に一次キャッシュとTLB (Translation
633Lookaside Buffer;高速変換緩衝機構)を内
634蔵しているが、プロセッサごとに多少の
635違いがある。そこで、これらの初期化は、hardware_init_hook 内
636に記述することを
637標準とする。
638
639(C) bssセクションとdataセクションの初期化
640
641bssセクション(含 sbssセクション)をゼロクリアする。
642
643dataセクション(含 sdataセクション)を初期化する。ROM化対応のために、ROM
644から RAM へと、コピーを行う。
645
646(D) software_init_hook の呼出し
647
648software_init_hook が 0 でない場合には、software_init_hook を呼び出す。
649software_init_hook は、カーネルが起動される前に行う必
650要があるソフトウェア
651環境(å…
652·ä½“的には、ライブラリ)依存の初期化を行うために用意している。
653
654software_init_hook がどこでも定義されていない場合、リンカでこのシンボルを
655 0 に定義する(リンカスクリプト内
656に記述あり)。
657
658(E) カーネルの起動
659
660kernel_start へ分岐し、カーネルを起動する。kernel_start からリターンして
661くることは想定していない。
662
663(reset.S)
664
6653.システム依存部の機能
666
6673.1 システムクロックドライバ
668
669システムクロックドライバが isig_tim を呼び出す周期は、sys_defs.h 中の
670TIC_NUME と TIC_DENO で定義されている(デフォルトでは 1ミリ秒周期)。この定
671義を変更することで、isig_tim を呼び出す周期を変更することができる。ただし、
672タイマの精度が供給クロックに依存するため、タイマの供給クロック単位で端数に
673なる値を設定した場合には、isig_tim の呼出し周期に誤差が生じることになる。
674
675デフォルトでは、下記のタイマを利用している。
676(a) VR5500
677 ターゲットボード搭載のタイマ(uPD71054)のタイマ0 (供給クロック 2MHz)
678(b) VR4131
679 VR4131内
680蔵RTC内
681TClockカウンタ (供給クロック 33.2MHz)
682
683なお、MIPS3コア内
684部のタイマは、ユーザーが利用することができる。
685
6863.2 性能評価用システム時刻参ç…
687§æ©Ÿèƒ½
688
689MIPS3ターゲット依存部では、性能評価用システム時刻参ç…
690§æ©Ÿèƒ½(vxget_tim)をサ
691ポートしている。SYSUTIM型はUD型(64ビットの符号無し整数型)で定義している。
692
693性能評価用システム時刻の精度は供給クロック単位であるが、タイマの現在値を
694読み出すために一時的にタイマを停止させる必
695要があるため、vxget_tim を呼ぶ
696度にシステムクロックが少しづつ遅
697れることになる。そこで、SUPPORT_VXGET_TIM
698というマクロにより、これらのサービスコールをサポートするかどうかを切り替
699えられるようにしている。
700(SUPPORT_VXGET_TIM は、sys_config.h の中で #define されている。)
701
7023.3 シリアルインタフェースドライバ
703
704(a) VR5500
705シリアルインタフェースドライバは、ボード上搭載のSCC(Serial Communication
706Controler)(TL16PIR552)のUART-CH#0、UART-CH#1をサポートしている。シリアル
707のサポートするポート数は、TNUM_PORTマクロにて定義する。デフォルトでは、
708ポート1とポート2の2ポートをサポートしている。なお、カーネルのログ出力用
709にはポート1に使用している。
710(TNUM_PORT は、sys_config.h の中で #define されている。)
711(tl16pir552.h, tl16pir552.c)
712
713(b) VR4131
714シリアルインタフェースドライバは、VR4131内
715蔵のDSIU(ディバグシリアルインタ
716フェースユニット)をサポートしている。これは、カーネルのログ出力用に使用し
717ている。
718
719なお、SCU(シリアルインタフェースユニット)は、サポートしていない。しかし、
720DSIU用のソースコードを変更することにより、対応が可能である。
721
722(vr4131_dsiu.h, vr4131_dsiu.c)
723
7243.4 メモリマップ
725
726メモリマップに関する設定は、リンカスクリプトにて行う。コンパイル時に利用
727するリンカスクリプトについては、Makefile.config にて設定を行う。
728(vrxxxxelf.ld, Makefile.config)
729
730なお、コード領域が 0xbfc00000 〜と、0x9fc00000 〜の2部構成になっており、
731さらに、スタートアドレスが、0x00000000 からでないために、ROMに焼き付ける
732とき、ROMアドレスとの対応が取れない。そのために、利用するROMライタで、
733適切なオフセット値の設定、および、適切なバッファクリアの設定を行う必
734要が
735ある。
736
737(a) VR5500
738・株式会社マイダス・ラボ製のRTE-VR5500-CB(64)(CPU: VR5500)
739
740今回の実装
741においては、コード領域を変更する形により、kseg0 または kseg1 で
742の動作の両方が可能である。変更は、リンカスクリプト内
743で行う。
744
745各々
746のメモリマップは以下通りである。
747
748・kseg0領域(キャッシュ領域)の場合
749 0x9fc00000 - 0x9fdfffff コード領域 (FLASH ROM 2Mbyte)
750 (0xa0000000 - 0xa00fffff ROM領域のミラー用に確保
751 (SRAM 1Mbyte))
752 0xa8000000 - 0xabffffff データ領域 (DRAM 64Mbyte)
753 - 0xabffffff 非タスクコンテキスト用スタック
754 0xbfc00000 - 0xbfc007ff 例外ベクタテーブル・初期化処理領域
755 (exce_vec_map, reset セクションで使用)
756(vr5500elf.ld)
757
758・kseg1領域(非キャッシュ領域)の場合
759 (0xa0000000 - 0xa00fffff ROM領域のミラー用に確保
760 (SRAM 1Mbyte))
761 0xa8000000 - 0xabffffff データ領域 (DRAM 64Mbyte)
762 - 0xabffffff 非タスクコンテキスト用スタック
763 0xbfc00000 - 0xbfcfffff コード領域 (ROM 1Mbyte)
764(vr5500elf.ld)
765
766(b) VR4131
767・京都マイクロコンピュータ株式会社製 KZ-Vr4131PCI-01 (CPU:VR4131)
768
769今回の実装
770においては、コード領域を変更する形により、kseg0 または kseg1 で
771の動作の両方が可能である。変更は、リンカスクリプト内
772で行う。
773
774各々
775のメモリマップは以下通りである。
776
777・kseg0領域(キャッシュ領域)の場合
778 0x9c000000 - 0x9c03ffff 非タスクコンテキスト用スタック
779 (SRAM 256kbyte)
780 0x9fc00700 - 0x9fdfffff コード領域 (FLASH ROM 2Mbyte弱)
781 (0xa0000000 - 0xa01fffff ROM領域のミラー用に確保
782 (DRAM 2Mbyte))
783 0xa0200000 - 0xa0ffffff データ領域 (DRAM 14Mbyte)
784 0xbfc00000 - 0xbfc006ff 例外ベクタテーブル・初期化処理領域
785 (FLASH ROM 0x700byte)
786 (exce_vec_map, reset セクションで使用)
787(vr4131elf.ld)
788
789・kseg1領域(非キャッシュ領域)の場合
790 (0xa0000000 - 0xa01fffff ROM領域のミラー用に確保
791 (DRAM 2Mbyte))
792 0xa0200000 - 0xa0ffffff データ領域 (DRAM 14Mbyte)
793 0xac000000 - 0xac03ffff 非タスクコンテキスト用スタック
794 (SRAM 256kbyte)
795 0xbfc00000 - 0xbfdfffff コード領域 (FLASH ROM 2Mbyte)
796(vr4131elf.ld に変更を加えることで対応可能)
797
7983.5 CP0ハザードについて
799
800MIPSでは、プロセッサによってはCP0ハザードが存在するものがある。そのための
801対応として、NOP_FOR_CP0_HAZARDマクロを定義する。これは、cpu_support.S内
802で
803利用している。
804
805定義方法は、必
806要な数分だけnopを並べることになる。
807(vr4131.h, vr5500.h)
808
8094.開発環境の構築
810
811開発環境の構築方法については、GNU開発環境構築マニュアルを参ç…
812§ã™ã‚‹ã“と。
813なお、ターゲット環境 <TARGET> の値については、以下を参考のこと。
814開発にはWindows2000SP4上でCygwinを用いた。
815
816動作確認は、下記のツールにて確認している。このツールをデフォルトとする。
817
818・GNUからé…
819å¸ƒã•ã‚Œã¦ã„るオリジナルのGCCなどをソースから構築したツール
820 動作確認を行ったときのバージョンは以下の通りである。
821 BINUTILS : 2.13.2.1
822 GCC-CORE : 3.3.2
823 NEWLIB : 1.11.0
824(この場合のターゲット環境 <TARGET> には、mipsel-nec-elf を用いる。)
825
8265.制限事項
827
828
829・ビッグエンディアンはサポートしていない。
830 (リトルエンディアンのみをサポートしている。)
831(sys_defs.h)
832
833・64bitモードはサポートしていない。
834
835・VR5500内
836蔵浮動小数点ユニットはサポートしていない。
837
838・スタートアップルーチン、リンクスクリプトは、C++に対応していない。
839
8406.その他
841
8426.1 ディレクトリ・ファイル構成
843
844MIPS3 ターゲット依存部の各ファイルの概要は次の通り。
845
846 config/mips3/
847 MIPS3å…
848±é€šéƒ¨
849
850 Makefile.config MakefileのMIPS3ターゲット依存の定義
851 cpu_defs.h プロセッサ依存部のアプリケーション用定義
852 cpu_config.h プロセッサ依存部の構成定義
853 cpu_config.c プロセッサ依存部の関数
854 cpu_support.S プロセッサ依存部のサブルーチン
855 cpu_context.h コンテキスト操作
856 cpu_rename.def カーネルの内
857部識別名のリネーム定義
858 cpu_rename.h カーネルの内
859部識別名のリネーム
860 cpu_unrename.h カーネルの内
861部識別名のリネーム解除
862 tool_defs.h 開発環境依存部のアプリケーション用定義
863 (GNU開発環境用)
864 tool_config.h 開発環境依存部の構成定義(GNU開発環境用)
865 makeoffset.c offset.h 生成サポートプログラム
866 cpu_insn.h 低レベルのプロセッサ操作ルーチン
867 exception_vector.S 例外ベクタアドレスでの分岐処理
868 start.S スタートアップモジュール
869 mips3.h MIPS3のレジスタ名などの定義
870 util.h ビット番号などの定義
871
872 config/mips3/vr5500/
873 VR5500(NEC)対応システム依存部
874 (株式会社マイダス・ラボ製 RTE-VR5500-CB(64) 対応)
875
876 Makefile.config MakefileのRTE-VR5500-CB(64)システム依存定義
877 sys_defs.h システム依存部のアプリケーション用定義
878 sys_config.h システム依存部の構成定義
879 sys_config.c システム依存部の関数
880 sys_support.S システム依存部のサブルーチン
881 sys_rename.def カーネルの内
882部識別名のリネーム定義
883 sys_rename.h カーネルの内
884部識別名のリネーム
885 sys_unrename.h カーネルの内
886部識別名のリネーム解除
887 sys_tool_config.h 開発環境依存部のシステム依存部構成定義
888 (GNU開発環境用)
889 hw_timer.h タイマ操作ルーチン
890 hw_serial.h SIOドライバ
891 hw_serial.cfg SIOドライバのコンフィギュレーションファイル
892 vr5500.h VR5500のハードウェア定義
893 pic_icu.h 割込みコントローラ関係の定義
894 rte_vr5500_cb.h RTE-VR5500-CB(64)ボードのハードウェア定義
895 upd71054.h NEC社μPD71054用 タイマドライバ関連の定義
896 (ターゲットボードRTE-VR5500-CB搭載のタイマ)
897 vr5500_elf.ld リンカスクリプト(ROM 化用)
898 vr5500_elf_ram.ld リンカスクリプト(RAM 転送用)
899
900 config/mips3/vr4131/
901 VR4131(NEC)対応システム依存部
902 (京都マイクロコンピュータ株式会社製 KZ-Vr4131PCI-01 対応)
903
904 Makefile.config MakefileのKZ-Vr4131PCI-01システム依存定義
905 sys_defs.h システム依存部のアプリケーション用定義
906 sys_config.h システム依存部の構成定義
907 sys_config.c システム依存部の関数
908 sys_support.S システム依存部のサブルーチン
909 sys_rename.def カーネルの内
910部識別名のリネーム定義
911 sys_rename.h カーネルの内
912部識別名のリネーム
913 sys_unrename.h カーネルの内
914部識別名のリネーム解除
915 sys_tool_config.h 開発環境依存部のシステム依存部構成定義
916 (GNU開発環境用)
917 hw_timer.h タイマ操作ルーチン
918 hw_serial.h SIOドライバ
919 hw_serial.cfg SIOドライバのコンフィギュレーションファイル
920 vr4131.h VR4131のハードウェア定義
921 vr4131_sil.h VR4131のハードウェアアクセス用システム
922 インタフェースレイヤー定義
923 vr4131_icu.h VR4131内
924蔵割込みコントロールユニットICU用
925 割込み関連の定義
926 vr4131_dsiu.h VR4131内
927蔵ディバグシリアルインタフェースユニット
928 DSIC用 簡易SIOドライバ関連の定義
929 vr4131_dsiu.c VR4131内
930蔵ディバグシリアルインタフェースユニット
931 DSIC用 簡易SIOドライバ
932 vr4131_rtc.h VR4131内
933蔵リアルタイムクロックユニットRTC用
934 タイマドライバ関連の定義
935 kz_vr4131pci_01.h KZ-Vr4131PCI-01ボードのハードウェア定義
936 vr4131_elf.ld リンカスクリプト(ROM 化用)
937 vr4131_elf_gdb.ld リンカスクリプト(GDB スタブ用)
938
939(以下、VR5500搭載ターゲットボードRTE-VR5500-CB向け)
940 pdic/simple_sio
941 tl16pir552.h TI社TL16PIR552用 簡易SIOドライバ関連の定義
942 tl16pir552.c TI社TL16PIR552用 簡易SIOドライバ
943 (ターゲットボードRTE-VR5500-CB搭載のシリアル
944 コントローラ)
945
9466.2 その他
947
948MIPS アーキテクチャを採用したプロセッサの種類は、非常に多いです。その中で、
949我々
950開発者
951側のターゲット環境の問題から、今回の実装
952は VR4131、VR5500 という
953特定のプロセッサのみのサポートとなっています。
954
955そこで、これらの、非常に多岐に渡っているプロセッサの動作テストに協力して
956いただける方を募集しております。
957
958是非、下記へとご連絡ください。お待
959ちしております。
960
961○TOPPERSプロジェクト メーリングリスト TOPPERS-USER
962
963○宮城県産業技術総合センター 機械電子情
964報技術部 情
965報技術開発班
966 TEL : 022-377-8700、e-mail : micom@mit.pref.miyagi.jp
967
968
9697.カーネル移植者
970への情
971å ±
972
973ここからは、今回のMIPSアーキテクチャへの実装
974を、今回実装
975を行ったターゲット
976プロセッサ以外のMIPSアーキテクチャプロセッサへと移植するための情
977報について
978まとめる。
979
9807.1 割込みコントローラICUとCPUとのインタフェースについて
981
982MIPS3å…
983±é€šéƒ¨ã§ã¯ã€å‰²è¾¼ã¿ã¨CPU例外までの分岐は行い、また、CPU例外における処
984理は行う。しかし、割込み要因に対する分岐は行わない。これは、MIPS3に接続さ
985れる割込みコントローラが特定できないことと、その多様性が非常に大きいから
986である。
987(cpu_support.S)
988
989そこで、以下に、その分岐のためのインタフェースならびに、その他のところで
990作成しなければならないマクロなどをまとめる。
991(cpu_support.S ; proc_interrupt以下)
992
993・割込み要因判別関係
994
995(1)割込み要因番号
996割込み要因を判断後に、割込みハンドラを呼び出すための引数となる番号。
9970 〜 7は、MIPS3å…
998±é€šéƒ¨ã«ãŠã„て INTNO_IP0 〜 INTNO_IP7 として定義している。
999(mips3.h)
1000そこで、システム依存部では、8番以降を定義する。
1001
1002(2)PUSH_ICU_IPM 割込みコントローラの割込みマスクの待
1003避
1004
1005【機能】
1006割込みコントローラの割込みマスクを、スタックへ保存する。
1007アセンブラで書いたマクロとして定義し、cpu_support.S内
1008で使用する。
1009外部に割込みコントローラを利用しないシステムでは、空で定義すること。
1010
1011(3)POP_ICU_IPM 割込みコントローラの割込みマスクの復å…
1012ƒ
1013
1014【機能】
1015割込みコントローラの割込みマスクを、スタックから復å…
1016ƒã™ã‚‹ã€‚
1017アセンブラで書いたマクロとして定義し、cpu_support.S内
1018で使用する。
1019外部に割込みコントローラを利用しないシステムでは、空で定義すること。
1020
1021(4)PROC_INTERRUPT_SYS または proc_interrupt_sys
1022 割込み要因に対する各ハンドラへの分岐処理
1023
1024【機能】
1025割込み要因を判断し、適切な割込みハンドラを呼び出す。
1026実装
1027方法は、マクロ(PROC_INTERRUPT_SYS)または、関数呼出(proc_interrupt_sys)
1028で行うこととする。
1029å…
1030·ä½“的には、以下のようなプロセスで実装
1031することになる。
1032 1. 割込み要因の判別
1033 2. 割込みマスク(コア、割込みコントローラ)の設定
1034 3. 割込み許可
1035 4. C言語ルーチンの呼出
1036 5. 割込み禁止
1037 6. 割込みコントローラの割込み要求のクリア
1038 (7. join_interrupt_and_exceptionに戻る。; 関数呼出の場合)
1039呼出時の引数としては、a1レジスタには割込み要求時のステータスレジスタの値
1040が、また、a2レジスタには原因レジスタの値が代å…
1041¥ã•ã‚Œã¦ã„るので、これらを利
1042用することができる。
1043
1044【備考】
1045・実装
1046においては、raレジスタは破壊してはならない。
1047・実行速度などの観点から、マクロ定義が優å…
1048ˆã™ã‚‹ã€‚
1049・詳しくは、下記「7.2 割込みハンドラの呼出処理の実装
1050例」を参ç…
1051§ã€‚
1052
1053・割込みマスク/割込み優å…
1054ˆåˆ¶å¾¡é–¢ä¿‚
1055
1056(1)ICU_IPM型
1057割込みコントローラについての、割込みマスクを扱うための型である。
1058
1059(2)CHECK_ICU_IPM ICUの割込みマスクIPMのチェックルーチン
1060
1061【C言語API】
1062 CHECK_ICU_IPM(ICU_IPM p);
1063
1064【パラメータ】
1065 ICU_IPM p チェックすべき ICU_IPM の値
1066
1067【機能】
1068割込みマスク p が、想定されている範囲にあるかどうかをチェックする。
1069C言語で利用する、マクロとして定義する。CHECK_IPM から呼び出される。
1070(pic_icu.h, vr4131_icu.h)
1071
1072(3)icu_set_ipm 割り込みコントローラのマスク設定
1073
1074【C言語API】
1075 icu_set_ipm(ICU_IPM *icu_ipm);
1076
1077【パラメータ】
1078 ICU_IPM icu_ipm 設定すべき ICU_IPM の値
1079
1080【リターンパラメータ】
1081 なし
1082
1083【機能】
1084割込みコントローラの割込みマスクを、icu_ipmに設定する。
1085(pic_icu.h, vr4131_icu.h)
1086
1087(4)icu_get_ipm 割り込みコントローラの割込みマスク取得
1088
1089【C言語API】
1090 icu_get_ipm(ICU_IPM *icu_ipm);
1091
1092【パラメータ】
1093 なし
1094
1095【リターンパラメータ】
1096 ICU_IPM icu_ipm 現在の ICU_IPM の値
1097
1098【機能】
1099割込みコントローラの割込みマスクを取得し、icu_ipmへ保存する。
1100(pic_icu.h, vr4131_icu.h)
1101
1102(5)icu_set_ilv 割込みコントローラの割込みマスクテーブル
1103 の設定
1104
1105【C言語API】
1106 icu_set_ilv(INTNO intno, ICU_IPM *icu_ipm);
1107
1108【パラメータ】
1109 INTNO intno 割込みマスクテーブルのインデックス
1110 ICU_IPM icu_ipm 設定する割込みマスクの値
1111
1112【機能】
1113割込みコントローラの割込みマスクテーブルの、intno番に割込みマスクicu_ipm
1114を設定する。all_set_ilvから呼び出される。
1115(pic_icu.h, vr4131_icu.h)
1116
11177.2 割込みハンドラの呼出処理の実装
1118例
1119
1120上記インタフェースに基づく、PROC_INTERRUPT_SYSまたはproc_interrupt_sys
1121の実装
1122例について説明をする。
1123
1124なお、今回の実装
1125においては、実装
1126例としてVR5500ではproc_interrupt_sys関数
1127を、VR4131ではPROC_INTERRUPT_SYSマクロを定義している。
1128(sys_support.S:VR5500, vr4131_icu.h:VR4131)
1129
1130今回の実装
1131においては、ターゲットボードの割込みコントローラの仕様を踏まえ、
1132若干の汎用性を持たせる形で実装
1133を行っている。
1134
1135個々
1136の処理についてコメントをしていく。
1137
1138 1. 割込み要因の判別
1139
1140 割込み要因の判別は、
1141 1.MIPS3コア内
1142部のCauseレジスタに基づく分岐
1143 2.割込みコントローラに基づく分岐
1144 の2段階での分岐判断を行っている。このうち、割込みコントローラについて
1145 の分岐は若干の汎用性を持たせるために、速度とのトレードオフを考æ…
1146®ã—て、
1147 PROC_INT(0:4)マクロを定義するような実装
1148を行っている。
1149 今回の実装
1150では、PROC_INT0のみを利用することとして、割込みコントローラ
1151 に関するヘッダファイル(VR5500では pic_icu.h、VR4131では vr4131_icu.h)
1152 にて定義されている。なお、このマクロにおいては、割込み要因番号がt0レジス
1153 に、割込み要求のクリアのための定数がt1レジスタに代å…
1154¥ã•ã‚Œã¦æˆ»ã‚‹ã€‚
1155
1156 (ここに、MIPS3コアの割込み要求をクリアするための処理が実装
1157されている。
1158 å…
1159·ä½“的には、Causeレジスタのクリアを行っている。)
1160
1161 2. 割込みマスク(コア、割込みコントローラ)の設定
1162
1163 割込みマスクの設定においては、SET_ICU_IPMマクロを定義し、汎用性を持た
1164 せている。このマクロの定義は、割込みコントローラに関するヘッダファイル
1165 (VR5500では pic_icu.h、VR4131では vr4131_icu.h)にて定義されている。
1166
1167 3. 割込み許可
1168
1169 int_tableのintmask要素から、MIPS3コアへの割込みマスクを取得し、その値を
1170 セットすることで割込み許可をしている。
1171
1172 4. C言語ルーチンの呼出
1173
1174 t0レジスタに保存されている割込み要因番号を用いて、int_tableから割込み
1175 ハンドラのアドレスを取得して、割込みハンドラを呼び出している。
1176
1177 5. 割込み禁止
1178
1179 割込み禁止は、StatusレジスタのIEビットがCPUロック状æ…
1180‹ã®åˆ¤æ–­ã«åˆ©ç”¨ã—て
1181 いるために、操作することができないので、同じStatusレジスタのEXLビット
1182 を操作することで、実現している。
1183
1184 6. 割込みコントローラの割込み要求のクリア
1185
1186 この処理は、割込みハンドラで行うことで対応するので、実装
1187していない。
1188
1189以上のような実装
1190を行っているが、今回のproc_interrupt_sysの実装
1191を利用して
1192他のターゲットへのポーティングを行う場合のインタフェースを以下にまとめる。
1193
1194(1) PROC_INT0 割込み要因の判断
1195
1196【リターンパラメータ】
1197 t0 割込み要因番号
1198 t1 割込み要求クリアのための定数
1199
1200【機能】
1201MIPS3コアの割込み要因IP2の要求に対応する割込みコントローラの、割込み要因を
1202判断する。割込み要因を判断後に、t0に割込み要因番号を、t1にMIPS3コア用の割
1203込み要求クリアのための定数å…
1204¥ã‚Œã¦ã€proc_ICU_IPMに飛ぶ。
1205アセンブラで書いたマクロとして定義し、sys_support.S 内
1206で使用する。
1207
1208(2) PROC_INT1 割込み要因の判断
1209
1210【リターンパラメータ】
1211 t0 割込み要因番号
1212 t1 割込み要求クリアのための定数
1213
1214【機能】
1215割込み要因IP3に対応する場合。以下、PROC_INT0と同様。
1216アセンブラで書いたマクロとして定義し、sys_support.S 内
1217で使用する。
1218
1219(3) PROC_INT2 割込み要因の判断
1220
1221【リターンパラメータ】
1222 t0 割込み要因番号
1223 t1 割込み要求クリアのための定数
1224
1225【機能】
1226割込み要因IP4に対応する場合。以下、PROC_INT0と同様。
1227アセンブラで書いたマクロとして定義し、sys_support.S 内
1228で使用する。
1229
1230(4) PROC_INT3 割込み要因の判断
1231
1232【リターンパラメータ】
1233 t0 割込み要因番号
1234 t1 割込み要求クリアのための定数
1235
1236【機能】
1237割込み要因IP5に対応する場合。以下、PROC_INT0と同様。
1238アセンブラで書いたマクロとして定義し、sys_support.S 内
1239で使用する。
1240
1241(5) PROC_INT4 割込み要因の判断
1242
1243【リターンパラメータ】
1244 t0 割込み要因番号
1245 t1 割込み要求クリアのための定数
1246
1247【機能】
1248割込み要因IP6に対応する場合。以下、PROC_INT0と同様。
1249アセンブラで書いたマクロとして定義し、sys_support.S 内
1250で使用する。
1251
1252(6)SET_ICU_IPM 割込みコントローラ依存のマスク設定
1253
1254【機能】
1255割込みコントローラの割込みマスクを設定する。
1256アセンブラで書いたマクロとして定義し、sys_support.S 内
1257で使用する。
1258
1259【備考】
1260このマクロを定義するときには、t0レジスタとt1レジスタを破壊してはならない。
1261t0には、割込み要因番号がå…
1262¥ã£ã¦ãŠã‚Šã€t1には、割込み要求クリアの定数がå…
1263¥ã£
1264ている。
1265
12667.3 その他
1267
1268下記に、カーネル移植には必
1269要は無いが、移植時に参考となるようなマクロなどを
1270説明する。
1271
1272(1)CHECK_IPM 割込みマスクのチェックマクロ
1273
1274【C言語API】
1275 CHECK_IPM(IPM p);
1276
1277【パラメータ】
1278 IPM p チェックすべき IPM の値
1279
1280【機能】
1281割込みマスク p が、想定されている範囲にあるかどうかをチェックする。
1282C言語で利用する、マクロとして定義する。xxx_ipm 内
1283で呼び出される。
1284(cpu_config.h)
1285
1286
1287変更履歴
1288
12892003年12月24日 JSPカーネル Release1.4 対応 (MIPS3版のサポートを開始)
12902004年 2月18日 誤植修正、2.3.3修正、7.3追加
12912004年 3月31日 3.4修正、「5.制限事項
1292」修正
12932004年 8月 9日 誤植修正
Note: See TracBrowser for help on using the repository browser.