= TOPPERS/JSPカーネル ユーザズマニュアル = (MIPS3 ターゲット依存部) (Release 1.4.1 対応,最終更新: 9-Aug-2004) ------------------------------------------------------------------------ TOPPERS/JSP Kernel Toyohashi Open Platform for Embedded Real-Time Systems/ Just Standard Profile Kernel Copyright (C) 2000-2004 by Embedded and Real-Time Systems Laboratory Toyohashi Univ. of Technology, JAPAN Copyright (C) 2001-2004 by Industrial Technology Institute, Miyagi Prefectural Government, JAPAN 上記著作権者は,Free Software Foundation によって公表されている GNU General Public License の Version 2 に記述されている条件か,以 下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェア(本ソフトウェ アを改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, 利用と呼ぶ)することを無償で許諾する. (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 権表示,この利用条件および下記の無保証規定が,そのままの形でソー スコード中に含まれていること. (2) 本ソフトウェアを再利用可能なバイナリコード(リロケータブルオブ ジェクトファイルやライブラリなど)の形で利用する場合には,利用 に伴うドキュメント(利用者マニュアルなど)に,上記の著作権表示, この利用条件および下記の無保証規定を掲載すること. (3) 本ソフトウェアを再利用不可能なバイナリコードの形または機器に組 み込んだ形で利用する場合には,次のいずれかの条件を満たすこと. (a) 利用に伴うドキュメント(利用者マニュアルなど)に,上記の著作 権表示,この利用条件および下記の無保証規定を掲載すること. (b) 利用の形態を,別に定める方法によって,上記著作権者に報告する こと. (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 害からも,上記著作権者を免責すること. 本ソフトウェアは,無保証で提供されているものである.上記著作権者は, 本ソフトウェアに関して,その適用可能性も含めて,いかなる保証も行わ ない.また,本ソフトウェアの利用により直接的または間接的に生じたい かなる損害に関しても,その責任を負わない. ------------------------------------------------------------------------ 1.MIPS3 ターゲット依存部の概要 1.1 ターゲットシステムと開発環境 MIPS3プロセッサのターゲットシステムとしては、以下のプロセッサをサポートし ている。 ・VR5500 (NEC) ・VR4131 (NEC) サポートしているボードは、以下の通りである。 ・株式会社マイダス・ラボ製 RTE-VR5500-CB(64) (CPU:VR5500) ・京都マイクロコンピュータ株式会社製 KZ-Vr4131PCI-01 (CPU:VR4131) 開発環境には、GCC などの GNU開発環境を用い、オブジェクトファイルフォーマッ トは ELF を標準とする。 以下、vr5500, vr4131ディレクトリを除いたmips3ディレクトリの範囲をプロセッサ 依存部と呼び、vr5500, vr4131ディレクトリに関することを、システム依存部と呼 ぶ。 MIPS3ターゲット依存部 = プロセッサ依存部 + システム依存部 1.2 サポートする機能の概要 MIPS3ターゲット依存の機能として、割込みマスクの変更・参照(chg_ipm、get_ipm) と、性能評価用システム時刻参照機能(vxget_tim)をサポートしている。割込みの 禁止と許可(dis_int、ena_int)はサポートしていない。 1.3 他のターゲットへのポーティング MIPS シリーズは、MIPS 社から供給されている CPU コアであり、このコアを用いた 様々なプロセッサが各メーカーから出荷されている。また、MIPS には、命令セット の拡張レベルに応じて MIPS I 〜 IV までが存在する。その中で、今回は MIPS III レベル(以下、MIPS3)の命令セットを用いた実装を行った。 これは今回実装を行ったプロセッサに関して、VR5500 は命令セットとして MIPS IV まで対応しているが、VR4131 は MIPS III までの対応であるためである。 (今回の実装を用いて、他のMIPSプロセッサへのポーティングを行うことが可能で ある。) 1.4 GDB スタブ 現在の TOPPERS/JSP カーネル MIPS3 版はROM化をサポートしている。 また、GDBスタブと組み合わせて使用することを考慮して、他機種版のJSPカーネルと 同様に、ソースコード内にGDB_STUBマクロによる条件コンパイルの設定を行っている。 このマクロの設定により、使用するリンカスクリプトを切り替えることで、対応を 行っている。 (/vrxxxx/makefile.config) MIPS3用のGDBスタブは、vr4131限定対応版が、完成しており、今後TOPPERSプロジェ クトホームページ、および、宮城県産業技術総合センターホームページを通じて 公開する予定である。 1.5 シリアルポート カーネルのログ出力用にシリアルポートを1つ使用する。 シリアルポートの設定は ・8ビット ・パリティなし ・ストップビット:1ビット ・ボーレート:9600bps である。 (tl16pir552.c, vr4131_dsiu.c;siopinib_table配列) なお、ボーレートについては、DEVIDE_RATIOマクロにて定義しているので必要に 応じて変更することができる。 (sys_config.h) 2.MIPS3ターゲット依存部の機能 この節では、カーネルおよびシステムサービスの機能の中で、MIPS3ターゲット依 存の部分について解説する。 2.1 データ型 int型および unsigned int型のサイズは 32ビットである。 現在は、MIPS自体は、64ビットアーキテクチャであるため、64ビットへの対応も 可能である。しかし、現段階での利用実績などから、今回は32ビットでの実装を 行った。 2.2 割込み管理機能とCPU例外 MIPS3では、割込みもCPU例外も一緒にし、「例外処理」という形で、処理を行って いる。そのため、メモリ管理・リセットなどの一部の致命的な例外を除き、ベク タアドレスは共通となっている。 (なお、今回の実装では、ROM化などの理由により、ステータスレジスタのBEVビッ トが1として実装を行っているので、ベクタアドレスは0xbfc00300になっている。) (sys_config.h ; INIT_SR) そこで、ベクタアドレスに飛んだ途中から、割込みとCPU例外(割込み以外の「例 外」を、以下、このように呼ぶこととする。)とに分岐させて処理を行う必要が ある。そこで、原因レジスタ(Cause;CP0)の例外コード(ExcCode)を用いて判断を 行って分岐している。 判断後の、各要因に対応するハンドラを呼び出すために、擬似ベクタテーブルを 設けている。 ・割込み INT_TABLE int_table[ TMAX_ALL_INTNO ] ICU_IPM icu_intmask_table[ TMAX_ALL_INTNO ] ・CPU例外 EXCVE exc_table[ TMAX_CORE_EXCNO ] ここで、割込みハンドラ擬似ベクタテーブルについては、MIPS3コアは、割込みの 優先度制御を行わないために、割込みハンドラ呼び出し時のMIPS3コアに関する割 込みマスクとをまとめたINT_TABLE型を定義し、配列の型とした。また、割込み コントローラについては、様々な割込みコントローラが存在することを考慮して、 移植性の観点からプロセッサ依存部から分離させて、システム依存部において割 込みコントローラ関連の実装を行う必要があるため、別にicu_intmask_table配 列を定義することで対応することとした。 (cpu_config.h, cpu_config.c, pic_icu.h, vr4131_icu.h) なお、ここで、 TMAX_ALL_INTNO : MIPS3コアと割込みコントローラとを含めた、割込み の総本数 (MIPS3コア の総本数 TMAX_CORE_INTNO (8本固定)と、割込み コントローラ管理下の総本数 TMAX_ICU_INTNO との合計。) TMAX_CORE_EXCNO : MIPS3コア管理下の、CPU例外の総本数(32本固定) である。 (mips3.h, cpu_config.h, pic_icu.h, vr4131_icu.h) ハンドラ擬似ベクタテーブルには、初期値として、デバック用にcpu_experr関数 が登録されている。これは、引数として、割込み・CPU例外・TLB, XTLB不一致発 生時のスタックポインタの値、ステータスレジスタの値、原因レジスタの値を持 つ関数であり、それらの値をログ出力用のポートに書き出す関数である。 (cpu_config.c) 以下では、2.3〜2.4では割込みについて説明し、2.5ではCPU例外について説明を する。 (MIPS3コアは、割込みコントローラを内蔵していないため、各ターゲットによっ て割込み処理が異なる。そこで、今回利用したターゲット以外に移植するための 割込み処理に関するインタフェース情報は、この文書の最後にまとめて記載して いるので、参照のこと。) 2.3 割込み管理機能 2.3.1 割込みコントローラICUとCPUとの接続 MIPS3コアは、割込みコントローラを内蔵していないため、別に設ける必要がある。 その割込みコントローラとの接続状況とを定義するために、INIT_CORE_IPM を定 義する。この値は、mips3.hで定義しているCause_Int(0:4)マクロを利用して定義 する。 (なお、このマクロは、最終的にはCP0の原因レジスタのビットを直接定義している。) (sys_config.h) (a) VR5500 VR5500は、割込みコントローラを内蔵していないために、ターゲットボード上に 割込みコントローラを設けている。この割込みコントローラとは、外部割込み Int(0:1)の2本で接続されている。 INIT_CORE_IPM = ( Cause_Int0 | Cause_Int0 ) (b) VR4131 VR4131は、割込みコントローラを内蔵している。この割込みコントローラとは、 外部割込みInt(0:2)の3本で接続されている。 (ハードウェア編p196参照) INIT_CORE_IPM = ( Cause_Int0 | Cause_Int1 | Cause_Int2 ) 2.3.2 割込みハンドラ 割込みハンドラは、上記の擬似ベクタテーブルに登録をして利用することになる。 このときの、テーブルを引くための引数である番号を「割込み要因番号」と呼ぶ。 0 〜 7は、MIPS3コアの各割込み要因に対応しており、共通部において INTNO_IP0 〜 INTNO_IP7 として定義している。 (mips3.h) また、8番以降を、システム依存部で以下のように定義している。 (a) VR5500 割込み要因 | 割込み要因番号 | マクロ名 −−−−−−−−−−−−−−−−−−−−−−−−−−−− タイマ0 | 8 | INTNO_TIMER0 −−−−−−−−−−−−−−−−−−−−−−−−−−−− シリアル0 | 9 | INTNO_SERIAL0 −−−−−−−−−−−−−−−−−−−−−−−−−−−− GBUS-INT0- | 10 | INTNO_GBUS −−−−−−−−−−−−−−−−−−−−−−−−−−−− BUS ERROR | 11 | INTNO_BUS_ERR −−−−−−−−−−−−−−−−−−−−−−−−−−−− タイマ1 | 12 | INTNO_TIMER1 −−−−−−−−−−−−−−−−−−−−−−−−−−−− シリアル1 | 13 | INTNO_SERIAL1 −−−−−−−−−−−−−−−−−−−−−−−−−−−− パラレル | 14 | INTNO_PARALEL −−−−−−−−−−−−−−−−−−−−−−−−−−−− DMAC INTREQ- | 15 | INTNO_DMAC (pic_icu.h) (b) VR4131 割込み要因 | 割込み要因番号 | マクロ名 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− バッテリ | 8 | INTNO_BAT −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− パワースイッチ | 9 | INTNO_POWER −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− RTCLong1 | 10 | INTNO_RTCL1 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ElipsedTime タイマ | 11 | INTNO_ETIME −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− GIU | 12 | INTNO_GIU −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− SIU | 13 | INTNO_SIU −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ソフトウェア | 14 | INTNO_SOFTINT −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− CLKRUN | 15 | INTNO_CLKRUN −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− RTCLong2 | 16 | INTNO_RTCL2 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− LED | 17 | INTNO_LED −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− TClockカウンタ | 18 | INTNO_TCLK −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− FIR | 19 | INTNO_FIR −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− DSIU | 20 | INTNO_DSIU −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− PCI | 21 | INTNO_PCI −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− SCU | 22 | INTNO_SCU −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− CSI | 23 | INTNO_CSI −−−−−−−−−−−−−−−−−−−−−−−−−−−−−− BCU | 24 | INTNO_BCU (vr4131_icu.h) 今回のターゲットにおいては、カーネルでは、以上の割込み要因の中から下記を 利用している。 (a) VR5500 タイマ0、シリアル0(、シリアル1) (b) VR4131 TClockカウンタ、DSIU 2.3.3 割込みマスク/割込み優先度制御 割込みマスク/割込み優先度制御のための、定義・APIは以下の通りである。 (1)IPM型 CPUコアと割込みコントローラとを全てまとめた、割込みマスクを扱うための型で ある。CORE_IPM型coreとICU_IPM型icuとからなる構造体として定義している。 (cpu_defs.h) CORE_IPM型は、ステータスレジスタに書込む値を保持するため、UINT型として定 義している。また、ICU_IPM型は、それぞれにターゲットボードについて下記の ように定義している。 (a) VR5500 VR5500は割込みコントローラを内蔵していないため、ターゲットボード上に割 込みコントローラを持っている。この割込みコントローラは、1バイト×2個 の割込みマスクを持っているので、ICU_IPM型は { int0m, int1m } = { UB型, UB型 } として定義している。 (b) VR4131 VR4131は割込みコントローラを内蔵している。この内蔵割込みコントローラは、 2バイト×2個の割込みマスク(MSYSINT1REG, MSYSINTREG2REGレジスタ)を持っ ているので、ICU_IPM型は { msysint1, msysint2 } = { UH型, UH型 } として定義している。 (cpu_defs.h, sys_defs.h) 今回の実装では、ICU_IPM 型の初期値として下記のようにしている。 (a) VR5500 タイマ0のみを許可している。 (b) VR4131 バッテリのみを許可している。 (sys_config.h) (coreの値は、ステータスレジスタに書込む、IM(0:7)の部分のみを保持する こと。他のビットも操作した場合の動作は、保証しない。) (2)all_set_ilv 割込みレベルの設定 【C言語API】 all_set_ilv(INTNO intno, IPM *ipm) 【パラメータ】 INTNO intno 割込み要因番号 IPM ipm 割込みマスク 【リターンパラメータ】 なし 【機能】 MIPS3コアおよび割り込みコントローラに関する、割込みハンドラ擬似ベクタテー ブル(int_tableならびに、icu_intmask_table)に、割込みマスクを設定する。 (cpu_config.h) なお、ターゲットボード上の割込みコントローラにもよるが、今回実装を行った ターゲットボードの割込みコントローラでは両方とも割込み優先度制御を行って いない。そのために、割込み優先度処理を割込みマスクの設定で行う必要がある。 この時、割込みマスクを設定するときは、IPM型構造体の要素であるCORE_IPM型 coreは、そのターゲットボードのハードウェア構成を反映しているものであるの で、原則として変更しないこととする。割込みレベルの設定は、接続されている 割込みコントローラの割込みマスクを変更することで対応することとする。 今回の実装における、優先度は以下の通りである。 (a) VR5500 優先度 : (低) シリアル1 -> シリアル0 -> タイマ0 (高) (rte-vr5500-cb.h) (b) VR4131 優先度 : (低) DSIU -> TClockカウンタ -> バッテリ残量不足検知 (高) (kz-vr4131pci-01.h) 2.4 chg_ipmのサポートについて chg_ipm をサポートするために、割込みハンドラの出入口処理などにオーバヘッ ドを生じている。そこで、SUPPORT_CHG_IPM というマクロにより、これらのサー ビスコールをサポートするかどうかを切り替えられるようにしている。 (SUPPORT_CHG_IPM は、cpu_config.h の中で #define されている。) MIPS3ターゲット依存の割込みマスクの変更・参照のためのサービスコールの仕様 は次の通り。 (1) chg_ipm 割込みマスクの変更 【C言語API】 ER ercd = chg_ipm(IPM ipm); 【パラメータ】 IPM ipm 設定すべき IPM の値 【リターンパラメータ】 ER ercd エラーコード 【エラーコード】 E_CTX コンテキストエラー E_PAR パラメータエラー(ipm が不正) 【機能】 割込みマスクを ipm で指定された値に設定する。指定した値が、MIPS3コア部分 については0〜MAX_IPMの範囲内に、割込みコントローラ部分については割込み コントローラの割込みマスクの範囲内に入っていない場合に、E_PARエラーを返 す。また、設定したIPMの値は、ディスパッチ後も引き継がれる。 ここで、MAX_IPMは、MIPS3コアに設定できる割込みマスクの最大のビットパター ンである。 このサービスコールは、タスクコンテキストで CPUロック解除状態の時のみ呼 び出すことができる。非タスクコンテキストや CPUロック状態で呼び出した場 合には、E_CTXエラーとなる。 (2) get_ipm 割込みマスクの参照 【C言語API】 ER ercd = get_ipm(IPM *p_ipm); 【パラメータ】 なし 【リターンパラメータ】 ER ercd エラーコード IPM ipm 現在の IPM の値 【エラーコード】 E_CTX コンテキストエラー 【機能】 現在の 割込みマスクの値を読み出し、ipm に返す。 このサービスコールは、タスクコンテキストで CPUロック解除状態の時のみ呼 び出すことができる。非タスクコンテキストや CPUロック状態で呼び出した場 合には、E_CTXエラーとなる。 なお、トレースログ機能に関して、chg_ipmに関する部分はシステム依存部にて 定義を行っている。 (sys_tool_config.h) 2.5 CPU例外管理機能とCPU例外ハンドラ DEF_EXC で指定するCPU例外要因番号(excno)は、MIPS3 での擬似ベクタテーブル のベクタ番号を表し、そのデータ型(EXCNO)は UINT型に定義されている。例外 要因番号はMIPS3の例外コードと1対1に対応している。 DEF_EXC で、例外要因番号として有効でない値や、CPU例外に対応しない番号を 指定した場合の動作は保証されない。 (1)引数p_excinf CPU例外ハンドラに渡されるp_excinfは、CPU例外発生時のコンテキストを保存 したスタックへのポインタが渡される。スタックの構造を以下に示す。 ---------------------- | sp (r29) | <-- p_excinf ---------------------- | at (r1) | ---------------------- | v0 (r2) | ---------------------- | v1 (r3) | ---------------------- | a0 (r4) | ---------------------- | a1 (r5) | ---------------------- | a2 (r6) | ---------------------- | a3 (r7) | ---------------------- | t0 (r8) | ---------------------- | t1 (r9) | ---------------------- | t2 (r10) | ---------------------- | t3 (r11) | ---------------------- | t4 (r12) | ---------------------- | t5 (r13) | ---------------------- | t6 (r14) | ---------------------- | t7 (r15) | ---------------------- | t8 (r24) | ---------------------- | t9 (r25) | ---------------------- | gp (r28) | ---------------------- | fp (r30) | ---------------------- | ra (r31) | ---------------------- | PC (EPC;CP0_r14) | ---------------------- | SR (Status;CP0_r12) | ---------------------- | HI | ---------------------- | LO | ---------------------- sp : Stack Pointer gp : Global Pointer fp : Frame Pointer ra : Return Address PC : Program Counter SR : Status Register また、CPU例外発生時のEPCの値は、例外発生命令が分岐スロットにある場合は、 直前の分岐・ジャンプ命令をさす。 (すなわち、対象命令のアドレス-4が書き込まれる。) 2.6 HI, LO レジスタ MIPS3では、乗除算レジスタHI, LOをサポートしている。そこで、今回の実装にお いては、割込みハンドラの出入口処理で、スタックへ保存している。 タスクコンテキスト内での、自らのディスパッチ呼び出しの場合は、関数呼び出 しであり、この呼び出しをまたがってこのレジスタを利用することは無いので、 保存していない。 (cpu_support.S) 2.7 スタートアップモジュール MIPS3ターゲットでは、例外ベクタの一つに、リセット並びに NMI(Non Maskable Interrupt)用のベクタアドレスを備えている。このアドレスからのジャンプ先が スタートアップモジュールとなっている。 このスタートアップモジュール(reset.S)では、次の初期化処理を行う。 (A) プロセッサの初期化 プロセッサの初期化は、下記のものを行う。 (a) CPUレジスタの初期化 乗除算レジスタ、スタックポインタsp、グローバルポインタgp、k0レジスタを初期 化する。 スタックポインタには、アドレス _stack_top を設定する。_stack_top は、リンカ スクリプト内で定義するものとする。ここで設定されるスタック領域は、非タスク コンテキスト用のスタック領域として、割込みハンドラなどで利用される。 (vrxxxxelf.ld) グローバルポインタには、アドレス _gp を設定する。_gp は、リンカスクリプト内 で定義するものとする。 (vrxxxxelf.ld) k0レジスタには、カーネル起動時は非タスクコンテキストでの実行とするので、1を 設定する。 (b) CP0レジスタの初期化 ステータスレジスタ、コンフィグレジスタ、ウォッチLoレジスタ、比較レジスタを 初期化する。 ステータスレジスタを INIT_SR に初期化する。INIT_SR は、sys_config.h で定義 することを想定している。このとき、ステータスレジスタ内の割込みマスクも設定 する。この時、割り込みマスクを INIT_CORE_IPM (sys_config.h) の値に設定する。 コンフィグレジスタを、INIT_CONFIG_MASK で初期化する。INIT_CONFIG_MASK は、 sys_config.h で定義することを想定している。このマスク値とOR演算を行うことで、 初期化を行っている。 (B) hardware_init_hook の呼出し hardware_init_hook が 0 でない場合には、hardware_init_hook を呼び出す。 hardware_init_hook は、一般にカーネルが起動される前に行う必要があるシステム 依存の初期化(例:RAMコントローラの初期化など)を記述するものとする。 記述場所は、sys_support.S を標準とする。 hardware_init_hook がどこでも定義されていない場合、リンカでこのシンボルを0 に定義する(リンカスクリプト内に記述あり)。 なお、MIPS3アーキテクチャでは、一般に一次キャッシュとTLB (Translation Lookaside Buffer;高速変換緩衝機構)を内蔵しているが、プロセッサごとに多少の 違いがある。そこで、これらの初期化は、hardware_init_hook 内に記述することを 標準とする。 (C) bssセクションとdataセクションの初期化 bssセクション(含 sbssセクション)をゼロクリアする。 dataセクション(含 sdataセクション)を初期化する。ROM化対応のために、ROM から RAM へと、コピーを行う。 (D) software_init_hook の呼出し software_init_hook が 0 でない場合には、software_init_hook を呼び出す。 software_init_hook は、カーネルが起動される前に行う必要があるソフトウェア 環境(具体的には、ライブラリ)依存の初期化を行うために用意している。 software_init_hook がどこでも定義されていない場合、リンカでこのシンボルを 0 に定義する(リンカスクリプト内に記述あり)。 (E) カーネルの起動 kernel_start へ分岐し、カーネルを起動する。kernel_start からリターンして くることは想定していない。 (reset.S) 3.システム依存部の機能 3.1 システムクロックドライバ システムクロックドライバが isig_tim を呼び出す周期は、sys_defs.h 中の TIC_NUME と TIC_DENO で定義されている(デフォルトでは 1ミリ秒周期)。この定 義を変更することで、isig_tim を呼び出す周期を変更することができる。ただし、 タイマの精度が供給クロックに依存するため、タイマの供給クロック単位で端数に なる値を設定した場合には、isig_tim の呼出し周期に誤差が生じることになる。 デフォルトでは、下記のタイマを利用している。 (a) VR5500 ターゲットボード搭載のタイマ(uPD71054)のタイマ0 (供給クロック 2MHz) (b) VR4131 VR4131内蔵RTC内TClockカウンタ (供給クロック 33.2MHz) なお、MIPS3コア内部のタイマは、ユーザーが利用することができる。 3.2 性能評価用システム時刻参照機能 MIPS3ターゲット依存部では、性能評価用システム時刻参照機能(vxget_tim)をサ ポートしている。SYSUTIM型はUD型(64ビットの符号無し整数型)で定義している。 性能評価用システム時刻の精度は供給クロック単位であるが、タイマの現在値を 読み出すために一時的にタイマを停止させる必要があるため、vxget_tim を呼ぶ 度にシステムクロックが少しづつ遅れることになる。そこで、SUPPORT_VXGET_TIM というマクロにより、これらのサービスコールをサポートするかどうかを切り替 えられるようにしている。 (SUPPORT_VXGET_TIM は、sys_config.h の中で #define されている。) 3.3 シリアルインタフェースドライバ (a) VR5500 シリアルインタフェースドライバは、ボード上搭載のSCC(Serial Communication Controler)(TL16PIR552)のUART-CH#0、UART-CH#1をサポートしている。シリアル のサポートするポート数は、TNUM_PORTマクロにて定義する。デフォルトでは、 ポート1とポート2の2ポートをサポートしている。なお、カーネルのログ出力用 にはポート1に使用している。 (TNUM_PORT は、sys_config.h の中で #define されている。) (tl16pir552.h, tl16pir552.c) (b) VR4131 シリアルインタフェースドライバは、VR4131内蔵のDSIU(ディバグシリアルインタ フェースユニット)をサポートしている。これは、カーネルのログ出力用に使用し ている。 なお、SCU(シリアルインタフェースユニット)は、サポートしていない。しかし、 DSIU用のソースコードを変更することにより、対応が可能である。 (vr4131_dsiu.h, vr4131_dsiu.c) 3.4 メモリマップ メモリマップに関する設定は、リンカスクリプトにて行う。コンパイル時に利用 するリンカスクリプトについては、Makefile.config にて設定を行う。 (vrxxxxelf.ld, Makefile.config) なお、コード領域が 0xbfc00000 〜と、0x9fc00000 〜の2部構成になっており、 さらに、スタートアドレスが、0x00000000 からでないために、ROMに焼き付ける とき、ROMアドレスとの対応が取れない。そのために、利用するROMライタで、 適切なオフセット値の設定、および、適切なバッファクリアの設定を行う必要が ある。 (a) VR5500 ・株式会社マイダス・ラボ製のRTE-VR5500-CB(64)(CPU: VR5500) 今回の実装においては、コード領域を変更する形により、kseg0 または kseg1 で の動作の両方が可能である。変更は、リンカスクリプト内で行う。 各々のメモリマップは以下通りである。 ・kseg0領域(キャッシュ領域)の場合 0x9fc00000 - 0x9fdfffff コード領域 (FLASH ROM 2Mbyte) (0xa0000000 - 0xa00fffff ROM領域のミラー用に確保 (SRAM 1Mbyte)) 0xa8000000 - 0xabffffff データ領域 (DRAM 64Mbyte) - 0xabffffff 非タスクコンテキスト用スタック 0xbfc00000 - 0xbfc007ff 例外ベクタテーブル・初期化処理領域 (exce_vec_map, reset セクションで使用) (vr5500elf.ld) ・kseg1領域(非キャッシュ領域)の場合 (0xa0000000 - 0xa00fffff ROM領域のミラー用に確保 (SRAM 1Mbyte)) 0xa8000000 - 0xabffffff データ領域 (DRAM 64Mbyte) - 0xabffffff 非タスクコンテキスト用スタック 0xbfc00000 - 0xbfcfffff コード領域 (ROM 1Mbyte) (vr5500elf.ld) (b) VR4131 ・京都マイクロコンピュータ株式会社製 KZ-Vr4131PCI-01 (CPU:VR4131) 今回の実装においては、コード領域を変更する形により、kseg0 または kseg1 で の動作の両方が可能である。変更は、リンカスクリプト内で行う。 各々のメモリマップは以下通りである。 ・kseg0領域(キャッシュ領域)の場合 0x9c000000 - 0x9c03ffff 非タスクコンテキスト用スタック (SRAM 256kbyte) 0x9fc00700 - 0x9fdfffff コード領域 (FLASH ROM 2Mbyte弱) (0xa0000000 - 0xa01fffff ROM領域のミラー用に確保 (DRAM 2Mbyte)) 0xa0200000 - 0xa0ffffff データ領域 (DRAM 14Mbyte) 0xbfc00000 - 0xbfc006ff 例外ベクタテーブル・初期化処理領域 (FLASH ROM 0x700byte) (exce_vec_map, reset セクションで使用) (vr4131elf.ld) ・kseg1領域(非キャッシュ領域)の場合 (0xa0000000 - 0xa01fffff ROM領域のミラー用に確保 (DRAM 2Mbyte)) 0xa0200000 - 0xa0ffffff データ領域 (DRAM 14Mbyte) 0xac000000 - 0xac03ffff 非タスクコンテキスト用スタック (SRAM 256kbyte) 0xbfc00000 - 0xbfdfffff コード領域 (FLASH ROM 2Mbyte) (vr4131elf.ld に変更を加えることで対応可能) 3.5 CP0ハザードについて MIPSでは、プロセッサによってはCP0ハザードが存在するものがある。そのための 対応として、NOP_FOR_CP0_HAZARDマクロを定義する。これは、cpu_support.S内で 利用している。 定義方法は、必要な数分だけnopを並べることになる。 (vr4131.h, vr5500.h) 4.開発環境の構築 開発環境の構築方法については、GNU開発環境構築マニュアルを参照すること。 なお、ターゲット環境 の値については、以下を参考のこと。 開発にはWindows2000SP4上でCygwinを用いた。 動作確認は、下記のツールにて確認している。このツールをデフォルトとする。 ・GNUから配布されているオリジナルのGCCなどをソースから構築したツール 動作確認を行ったときのバージョンは以下の通りである。 BINUTILS : 2.13.2.1 GCC-CORE : 3.3.2 NEWLIB : 1.11.0 (この場合のターゲット環境 には、mipsel-nec-elf を用いる。) 5.制限事項 ・ビッグエンディアンはサポートしていない。 (リトルエンディアンのみをサポートしている。) (sys_defs.h) ・64bitモードはサポートしていない。 ・VR5500内蔵浮動小数点ユニットはサポートしていない。 ・スタートアップルーチン、リンクスクリプトは、C++に対応していない。 6.その他 6.1 ディレクトリ・ファイル構成 MIPS3 ターゲット依存部の各ファイルの概要は次の通り。 config/mips3/ MIPS3共通部 Makefile.config MakefileのMIPS3ターゲット依存の定義 cpu_defs.h プロセッサ依存部のアプリケーション用定義 cpu_config.h プロセッサ依存部の構成定義 cpu_config.c プロセッサ依存部の関数 cpu_support.S プロセッサ依存部のサブルーチン cpu_context.h コンテキスト操作 cpu_rename.def カーネルの内部識別名のリネーム定義 cpu_rename.h カーネルの内部識別名のリネーム cpu_unrename.h カーネルの内部識別名のリネーム解除 tool_defs.h 開発環境依存部のアプリケーション用定義 (GNU開発環境用) tool_config.h 開発環境依存部の構成定義(GNU開発環境用) makeoffset.c offset.h 生成サポートプログラム cpu_insn.h 低レベルのプロセッサ操作ルーチン exception_vector.S 例外ベクタアドレスでの分岐処理 start.S スタートアップモジュール mips3.h MIPS3のレジスタ名などの定義 util.h ビット番号などの定義 config/mips3/vr5500/ VR5500(NEC)対応システム依存部 (株式会社マイダス・ラボ製 RTE-VR5500-CB(64) 対応) Makefile.config MakefileのRTE-VR5500-CB(64)システム依存定義 sys_defs.h システム依存部のアプリケーション用定義 sys_config.h システム依存部の構成定義 sys_config.c システム依存部の関数 sys_support.S システム依存部のサブルーチン sys_rename.def カーネルの内部識別名のリネーム定義 sys_rename.h カーネルの内部識別名のリネーム sys_unrename.h カーネルの内部識別名のリネーム解除 sys_tool_config.h 開発環境依存部のシステム依存部構成定義 (GNU開発環境用) hw_timer.h タイマ操作ルーチン hw_serial.h SIOドライバ hw_serial.cfg SIOドライバのコンフィギュレーションファイル vr5500.h VR5500のハードウェア定義 pic_icu.h 割込みコントローラ関係の定義 rte_vr5500_cb.h RTE-VR5500-CB(64)ボードのハードウェア定義 upd71054.h NEC社μPD71054用 タイマドライバ関連の定義 (ターゲットボードRTE-VR5500-CB搭載のタイマ) vr5500_elf.ld リンカスクリプト(ROM 化用) vr5500_elf_ram.ld リンカスクリプト(RAM 転送用) config/mips3/vr4131/ VR4131(NEC)対応システム依存部 (京都マイクロコンピュータ株式会社製 KZ-Vr4131PCI-01 対応) Makefile.config MakefileのKZ-Vr4131PCI-01システム依存定義 sys_defs.h システム依存部のアプリケーション用定義 sys_config.h システム依存部の構成定義 sys_config.c システム依存部の関数 sys_support.S システム依存部のサブルーチン sys_rename.def カーネルの内部識別名のリネーム定義 sys_rename.h カーネルの内部識別名のリネーム sys_unrename.h カーネルの内部識別名のリネーム解除 sys_tool_config.h 開発環境依存部のシステム依存部構成定義 (GNU開発環境用) hw_timer.h タイマ操作ルーチン hw_serial.h SIOドライバ hw_serial.cfg SIOドライバのコンフィギュレーションファイル vr4131.h VR4131のハードウェア定義 vr4131_sil.h VR4131のハードウェアアクセス用システム インタフェースレイヤー定義 vr4131_icu.h VR4131内蔵割込みコントロールユニットICU用 割込み関連の定義 vr4131_dsiu.h VR4131内蔵ディバグシリアルインタフェースユニット DSIC用 簡易SIOドライバ関連の定義 vr4131_dsiu.c VR4131内蔵ディバグシリアルインタフェースユニット DSIC用 簡易SIOドライバ vr4131_rtc.h VR4131内蔵リアルタイムクロックユニットRTC用 タイマドライバ関連の定義 kz_vr4131pci_01.h KZ-Vr4131PCI-01ボードのハードウェア定義 vr4131_elf.ld リンカスクリプト(ROM 化用) vr4131_elf_gdb.ld リンカスクリプト(GDB スタブ用) (以下、VR5500搭載ターゲットボードRTE-VR5500-CB向け) pdic/simple_sio tl16pir552.h TI社TL16PIR552用 簡易SIOドライバ関連の定義 tl16pir552.c TI社TL16PIR552用 簡易SIOドライバ (ターゲットボードRTE-VR5500-CB搭載のシリアル コントローラ) 6.2 その他 MIPS アーキテクチャを採用したプロセッサの種類は、非常に多いです。その中で、 我々開発者側のターゲット環境の問題から、今回の実装は VR4131、VR5500 という 特定のプロセッサのみのサポートとなっています。 そこで、これらの、非常に多岐に渡っているプロセッサの動作テストに協力して いただける方を募集しております。 是非、下記へとご連絡ください。お待ちしております。 ○TOPPERSプロジェクト メーリングリスト TOPPERS-USER ○宮城県産業技術総合センター 機械電子情報技術部 情報技術開発班 TEL : 022-377-8700、e-mail : micom@mit.pref.miyagi.jp 7.カーネル移植者への情報 ここからは、今回のMIPSアーキテクチャへの実装を、今回実装を行ったターゲット プロセッサ以外のMIPSアーキテクチャプロセッサへと移植するための情報について まとめる。 7.1 割込みコントローラICUとCPUとのインタフェースについて MIPS3共通部では、割込みとCPU例外までの分岐は行い、また、CPU例外における処 理は行う。しかし、割込み要因に対する分岐は行わない。これは、MIPS3に接続さ れる割込みコントローラが特定できないことと、その多様性が非常に大きいから である。 (cpu_support.S) そこで、以下に、その分岐のためのインタフェースならびに、その他のところで 作成しなければならないマクロなどをまとめる。 (cpu_support.S ; proc_interrupt以下) ・割込み要因判別関係 (1)割込み要因番号 割込み要因を判断後に、割込みハンドラを呼び出すための引数となる番号。 0 〜 7は、MIPS3共通部において INTNO_IP0 〜 INTNO_IP7 として定義している。 (mips3.h) そこで、システム依存部では、8番以降を定義する。 (2)PUSH_ICU_IPM 割込みコントローラの割込みマスクの待避 【機能】 割込みコントローラの割込みマスクを、スタックへ保存する。 アセンブラで書いたマクロとして定義し、cpu_support.S内で使用する。 外部に割込みコントローラを利用しないシステムでは、空で定義すること。 (3)POP_ICU_IPM 割込みコントローラの割込みマスクの復元 【機能】 割込みコントローラの割込みマスクを、スタックから復元する。 アセンブラで書いたマクロとして定義し、cpu_support.S内で使用する。 外部に割込みコントローラを利用しないシステムでは、空で定義すること。 (4)PROC_INTERRUPT_SYS または proc_interrupt_sys 割込み要因に対する各ハンドラへの分岐処理 【機能】 割込み要因を判断し、適切な割込みハンドラを呼び出す。 実装方法は、マクロ(PROC_INTERRUPT_SYS)または、関数呼出(proc_interrupt_sys) で行うこととする。 具体的には、以下のようなプロセスで実装することになる。 1. 割込み要因の判別 2. 割込みマスク(コア、割込みコントローラ)の設定 3. 割込み許可 4. C言語ルーチンの呼出 5. 割込み禁止 6. 割込みコントローラの割込み要求のクリア (7. join_interrupt_and_exceptionに戻る。; 関数呼出の場合) 呼出時の引数としては、a1レジスタには割込み要求時のステータスレジスタの値 が、また、a2レジスタには原因レジスタの値が代入されているので、これらを利 用することができる。 【備考】 ・実装においては、raレジスタは破壊してはならない。 ・実行速度などの観点から、マクロ定義が優先する。 ・詳しくは、下記「7.2 割込みハンドラの呼出処理の実装例」を参照。 ・割込みマスク/割込み優先制御関係 (1)ICU_IPM型 割込みコントローラについての、割込みマスクを扱うための型である。 (2)CHECK_ICU_IPM ICUの割込みマスクIPMのチェックルーチン 【C言語API】 CHECK_ICU_IPM(ICU_IPM p); 【パラメータ】 ICU_IPM p チェックすべき ICU_IPM の値 【機能】 割込みマスク p が、想定されている範囲にあるかどうかをチェックする。 C言語で利用する、マクロとして定義する。CHECK_IPM から呼び出される。 (pic_icu.h, vr4131_icu.h) (3)icu_set_ipm 割り込みコントローラのマスク設定 【C言語API】 icu_set_ipm(ICU_IPM *icu_ipm); 【パラメータ】 ICU_IPM icu_ipm 設定すべき ICU_IPM の値 【リターンパラメータ】 なし 【機能】 割込みコントローラの割込みマスクを、icu_ipmに設定する。 (pic_icu.h, vr4131_icu.h) (4)icu_get_ipm 割り込みコントローラの割込みマスク取得 【C言語API】 icu_get_ipm(ICU_IPM *icu_ipm); 【パラメータ】 なし 【リターンパラメータ】 ICU_IPM icu_ipm 現在の ICU_IPM の値 【機能】 割込みコントローラの割込みマスクを取得し、icu_ipmへ保存する。 (pic_icu.h, vr4131_icu.h) (5)icu_set_ilv 割込みコントローラの割込みマスクテーブル の設定 【C言語API】 icu_set_ilv(INTNO intno, ICU_IPM *icu_ipm); 【パラメータ】 INTNO intno 割込みマスクテーブルのインデックス ICU_IPM icu_ipm 設定する割込みマスクの値 【機能】 割込みコントローラの割込みマスクテーブルの、intno番に割込みマスクicu_ipm を設定する。all_set_ilvから呼び出される。 (pic_icu.h, vr4131_icu.h) 7.2 割込みハンドラの呼出処理の実装例 上記インタフェースに基づく、PROC_INTERRUPT_SYSまたはproc_interrupt_sys の実装例について説明をする。 なお、今回の実装においては、実装例としてVR5500ではproc_interrupt_sys関数 を、VR4131ではPROC_INTERRUPT_SYSマクロを定義している。 (sys_support.S:VR5500, vr4131_icu.h:VR4131) 今回の実装においては、ターゲットボードの割込みコントローラの仕様を踏まえ、 若干の汎用性を持たせる形で実装を行っている。 個々の処理についてコメントをしていく。 1. 割込み要因の判別 割込み要因の判別は、 1.MIPS3コア内部のCauseレジスタに基づく分岐 2.割込みコントローラに基づく分岐 の2段階での分岐判断を行っている。このうち、割込みコントローラについて の分岐は若干の汎用性を持たせるために、速度とのトレードオフを考慮して、 PROC_INT(0:4)マクロを定義するような実装を行っている。 今回の実装では、PROC_INT0のみを利用することとして、割込みコントローラ に関するヘッダファイル(VR5500では pic_icu.h、VR4131では vr4131_icu.h) にて定義されている。なお、このマクロにおいては、割込み要因番号がt0レジス に、割込み要求のクリアのための定数がt1レジスタに代入されて戻る。 (ここに、MIPS3コアの割込み要求をクリアするための処理が実装されている。 具体的には、Causeレジスタのクリアを行っている。) 2. 割込みマスク(コア、割込みコントローラ)の設定 割込みマスクの設定においては、SET_ICU_IPMマクロを定義し、汎用性を持た せている。このマクロの定義は、割込みコントローラに関するヘッダファイル (VR5500では pic_icu.h、VR4131では vr4131_icu.h)にて定義されている。 3. 割込み許可 int_tableのintmask要素から、MIPS3コアへの割込みマスクを取得し、その値を セットすることで割込み許可をしている。 4. C言語ルーチンの呼出 t0レジスタに保存されている割込み要因番号を用いて、int_tableから割込み ハンドラのアドレスを取得して、割込みハンドラを呼び出している。 5. 割込み禁止 割込み禁止は、StatusレジスタのIEビットがCPUロック状態の判断に利用して いるために、操作することができないので、同じStatusレジスタのEXLビット を操作することで、実現している。 6. 割込みコントローラの割込み要求のクリア この処理は、割込みハンドラで行うことで対応するので、実装していない。 以上のような実装を行っているが、今回のproc_interrupt_sysの実装を利用して 他のターゲットへのポーティングを行う場合のインタフェースを以下にまとめる。 (1) PROC_INT0 割込み要因の判断 【リターンパラメータ】 t0 割込み要因番号 t1 割込み要求クリアのための定数 【機能】 MIPS3コアの割込み要因IP2の要求に対応する割込みコントローラの、割込み要因を 判断する。割込み要因を判断後に、t0に割込み要因番号を、t1にMIPS3コア用の割 込み要求クリアのための定数入れて、proc_ICU_IPMに飛ぶ。 アセンブラで書いたマクロとして定義し、sys_support.S 内で使用する。 (2) PROC_INT1 割込み要因の判断 【リターンパラメータ】 t0 割込み要因番号 t1 割込み要求クリアのための定数 【機能】 割込み要因IP3に対応する場合。以下、PROC_INT0と同様。 アセンブラで書いたマクロとして定義し、sys_support.S 内で使用する。 (3) PROC_INT2 割込み要因の判断 【リターンパラメータ】 t0 割込み要因番号 t1 割込み要求クリアのための定数 【機能】 割込み要因IP4に対応する場合。以下、PROC_INT0と同様。 アセンブラで書いたマクロとして定義し、sys_support.S 内で使用する。 (4) PROC_INT3 割込み要因の判断 【リターンパラメータ】 t0 割込み要因番号 t1 割込み要求クリアのための定数 【機能】 割込み要因IP5に対応する場合。以下、PROC_INT0と同様。 アセンブラで書いたマクロとして定義し、sys_support.S 内で使用する。 (5) PROC_INT4 割込み要因の判断 【リターンパラメータ】 t0 割込み要因番号 t1 割込み要求クリアのための定数 【機能】 割込み要因IP6に対応する場合。以下、PROC_INT0と同様。 アセンブラで書いたマクロとして定義し、sys_support.S 内で使用する。 (6)SET_ICU_IPM 割込みコントローラ依存のマスク設定 【機能】 割込みコントローラの割込みマスクを設定する。 アセンブラで書いたマクロとして定義し、sys_support.S 内で使用する。 【備考】 このマクロを定義するときには、t0レジスタとt1レジスタを破壊してはならない。 t0には、割込み要因番号が入っており、t1には、割込み要求クリアの定数が入っ ている。 7.3 その他 下記に、カーネル移植には必要は無いが、移植時に参考となるようなマクロなどを 説明する。 (1)CHECK_IPM 割込みマスクのチェックマクロ 【C言語API】 CHECK_IPM(IPM p); 【パラメータ】 IPM p チェックすべき IPM の値 【機能】 割込みマスク p が、想定されている範囲にあるかどうかをチェックする。 C言語で利用する、マクロとして定義する。xxx_ipm 内で呼び出される。 (cpu_config.h) 変更履歴 2003年12月24日 JSPカーネル Release1.4 対応 (MIPS3版のサポートを開始) 2004年 2月18日 誤植修正、2.3.3修正、7.3追加 2004年 3月31日 3.4修正、「5.制限事項」修正 2004年 8月 9日 誤植修正