
            ＝ TOPPERS/JSPカーネル ユーザズマニュアル ＝
                 （SH3/SH4 ターゲット依存部）

          （Release 1.4.2対応，最終更新: 11-Jul-2005）

------------------------------------------------------------------------ 
 TOPPERS/JSP Kernel
     Toyohashi Open Platform for Embedded Real-Time Systems/
     Just Standard Profile Kernel

 Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                             Toyohashi Univ. of Technology, JAPAN

 上記著作権者は，以下の (1)〜(4) の条件か，Free Software Foundation 
 によって公表されている GNU General Public License の Version 2 に記
 述されている条件を満たす場合に限り，本ソフトウェア（本ソフトウェア
 を改変したものを含む．以下同じ）を使用・複製・改変・再配布（以下，
 利用と呼ぶ）することを無償で許諾する．
 (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
     権表示，この利用条件および下記の無保証規定が，そのままの形でソー
     スコード中に含まれていること．
 (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使
     用できる形で再配布する場合には，再配布に伴うドキュメント（利用
     者マニュアルなど）に，上記の著作権表示，この利用条件および下記
     の無保証規定を掲載すること．
 (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使
     用できない形で再配布する場合には，次のいずれかの条件を満たすこ
     と．
   (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著
       作権表示，この利用条件および下記の無保証規定を掲載すること．
   (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに
       報告すること．
 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．

 本ソフトウェアは，無保証で提供されているものである．上記著作権者お
 よびTOPPERSプロジェクトは，本ソフトウェアに関して，その適用可能性も
 含めて，いかなる保証も行わない．また，本ソフトウェアの利用により直
 接的または間接的に生じたいかなる損害に関しても，その責任を負わない．

 @(#) $Id: sh3.txt,v 1.1 2009-12-23 14:49:01 suikan Exp $
------------------------------------------------------------------------

１．SH3/SH4 ターゲット依存部の概要


1.1 ターゲットシステムと開発環境

SH3/SH4 プロセッサのターゲットシステムとしては，SH7709A，SH7729R，
SH7727，SH7750を搭載した以下のボードをサポートしている．なお，SH3-DSP 
の DSP 機能，SH4 の FPU はサポートしていない．（ディスパッチ時及び割込
みの入り口で関連するレジスタを保存していない）

・(株)日立超LSIシステムズ製の MS7709ASE01 ボード (CPU: SH7709A)
・(株)日立超LSIシステムズ製の MS7729RSE01 ボード (CPU: SH7729R)
・(株)日立超LSIシステムズ製の MS7750SE01  ボード (CPU: SH7750)
・(株)日立超LSIシステムズ製の MS7727CP01  ボード (CPU: SH7727)

なお，MS7709ASE01，MS7729RSE01，MS7750SE01は，ハードウェア構成が似通っ
ているため， solution_engine という名前のシステム依存部としてまとめて
いる．切り替えは，システム依存部の Makefile.clonfig で指定する．以下，
これら3種類のボードを特に区別しない場合は，Solution Engine と表記する．

開発環境には，GCC などの GNU開発環境を用い，オブジェクトファイルフォー
マットは ELF を標準とする．

Solution Engine では実行環境として，GDBスタブを用いる方法と JTAG-ICE 
を用いる方法をサポートする．GDBスタブは Toppers プロジェクトのホームペー
ジからダウンロード可能である．JTAG-ICEとしては，京都マイクロコンピュー
タ製のPARTNER-Jでの動作を確認している．GDBスタブを用いる場合には，
Makefile 中で，DBGENV に GDB_STUB を設定する（デフォルト）．PARTNER-J
を用いる場合には，DBGENVに PARTNER_J を設定する．

MS7727CP01 では，T-Monitor を用いる方法とJTAG-ICEを用いる方法をサポート
する．なお，T-Monitor を使ってデバッグすることは不可能であり，単なるロー
ダーとして用いる．具体的には，カーネルをSレコードに変換し，T-Monitor
でダウンロードして実行する．カーネル終了時は，プロセッサをリセットする．


1.2 サポートする機能の概要

SH3 依存の機能として，割込みマスクの変更・参照(chg_ixx，get_ixx)と，性
能評価用システム時刻参照機能(vxget_tim)をサポートしている．割込みの禁
止と許可(dis_int，ena_int)はサポートしていない．


1.3 他のターゲットへのポーティング

現バージョンでは，SH7708 を用いたシステム依存部は存在しない．しかしな
がら，プロセッサ依存部のコード自体は SH7708 をサポートする．そのため，
SH7708をサポートするシステム依存部を作成することは容易である．その場合
には，コンパイルオプションもしくは sys_defs.h で SH7708 を定義すればよ
い．


1.4 シリアルポート

カーネルのログ出力用として，Solution Engine ではスーパーI/O内蔵
SCI(CN3)を 19200bps で使用する．MS7727CP01 では，CPUボード上のシリアル
インタフェースコネクタを 115200bps で使用する．なお，全てのポートにお
いて データ: 8bit,Parity:none,Stop:1bitである．


1.5 エンディアン

各ターゲットはディップスイッチによりエンディアンを変更することが可能で
ある．これに合わせて，カーネルのエンディアンの設定は各システム依存部で
変更可能である．エンディアンは以下の個所で設定する．

 ・システム依存部の Makefile.config 
    コンパイルオプション -ml  or -mb
    リンカオプション     -ml  or -mb
    リンカスクリプト     shlelf.ld or shelf.ld

 ・システム定義
    SIL_ENDIAN     SIL_ENDIAN_LITTLE or SIL_ENDIAN_BIG


２．SH3 プロセッサ依存部の機能

この節では，カーネルおよびシステムサービスの機能の中で，SH3依存の部分
について解説する．


2.1 データ型

int型および unsigned int型のサイズは 32ビットである．


2.2 割込み管理機能と割込みハンドラ

カーネル管理外の割込みとしては， NMI がある．よって，CPUロック状態や初
期化ルーチン内では，NMI 以外の割込みはすべて禁止されている．具体的には，
IPM(Interrupt Priority Mask)が 15 に設定される．しかしながら，ボード上
に NMI 入力を持たないターゲットのため，GDBスタブがホストのマシンと通信
するためのシリアルポートの優先度を 15 で登録し，GDB で Ctrl-C を押すと 
割り込みが入りスタブに制御が移るようにしてある．この機能を使用するため
にはCPUロック状態では，優先度が 14 になるようにしなければならない．そ
のため，CPUロックで設定される優先度をマクロで MAX_IPM で指定している．
MAX_IPM はcpu_config.h の中で定義されている．GDBスタブを使う場合は 14 
にGDBスタブを使わない場合は 15 に設定している．

DEF_INH で指定する割込みハンドラ番号(inhno)は，SH7708/50 では，割り込
み事象レジスタ(INTEVT)に設定されるコードであり，SH7709A/09/29R/27 では，
割り込み事象レジスタ2(INTEVT2)に設定されるコードである．データ型
(INHNO)は unsigned int型に定義されている．DEF_INH で，INTEVT,INTEVT2コー
ドとして有効でない値や，外部割込みに対応しない番号を指定した場合の動作
は保証されない．

SH3依存の機能として，SR(Status Register)中の 割り込みマスクビット(I3〜
I0)の値を変更するためのサービスコール chg_ipm と，参照するためのサービ
スコール get_ipm をサポートしている．なお，割り込みマスクビットの値を
表すデータ型 IPM は，unsigned int型に定義されている．

これらのサービスコールは，タスクコンテキストで CPUロック解除状態の場合
にのみ呼び出すことができる．chg_ipm により IPM を 0 以外(すなわち，何
らかの割込みが禁止されている状態)にした場合でも，ディスパッチは禁止さ
れず，chg_ipm により変更した IPM の値は，ディスパッチ後のタスクに引き
継がれる．例えば，あるタスクで IPM を 1 に変更した後，何らかの割込みに
より別のタスクに切り替わると，切り替わった後のタスクでも IPM は 1 にな
る．

chg_ipm をサポートするために，割込みハンドラの出入口処理などにオーバヘッ
ドを生じている．そこで，SUPPORT_CHG_IPM というマクロにより，これらのサー
ビスコールをサポートするかどうかを切り替えられるようにしている．
SUPPORT_CHG_IPM は，cpu_config.h の中で #define されている．

SH3依存の割込みマスクの変更・参照のためのサービスコールの仕様は次の
通り．


(1) chg_ipm                     割込みマスクの変更

【C言語API】
        ER ercd = chg_ipm(IPM ipm);

【パラメータ】
        IPM     ipm             設定すべき IPM の値

【リターンパラメータ】
        ER      ercd            エラーコード

【エラーコード】
        E_CTX           コンテキストエラー
        E_PAR           パラメータエラー(ipm が不正)

【機能】

IPM(Interrupt Priority Mask)を ipm で指定された値に設定する．指定した
値が 0〜13ないし14以外の場合，E_PARエラーとなる．IPM を 1〜MAX_IPM -1 
に設定した場合でも，ディスパッチは禁止されない．また，設定した IPM の
値は，ディスパッチ後も引き継がれる．

なお，このサービスコールを用いて，IPM を MAX_IPM (すべての割込みを禁止)
に設定することはできない．IPM を MAX_IPM にしたい場合には，loc_cpu を
使うべきである．

このサービスコールは，タスクコンテキストで CPUロック解除状態の時のみ呼
び出すことができる．非タスクコンテキストや CPUロック状態で呼び出した場
合には，E_CTXエラーとなる．


(2) get_ipm                     割込みマスクの参照

【C言語API】
        ER ercd = get_ipm(IPM *p_ipm);

【パラメータ】
        なし

【リターンパラメータ】
        ER      ercd            エラーコード
        IPM     ipm             現在の IPM の値

【エラーコード】
        E_CTX           コンテキストエラー

【機能】

現在の IPM(Interrupt Priority Mask)の値を読み出し，ipm に返す．

このサービスコールは，タスクコンテキストで CPUロック解除状態の時のみ呼
び出すことができる．非タスクコンテキストや CPUロック状態で呼び出した場
合には，E_CTXエラーとなる．


2.3 CPU例外管理機能とCPU例外ハンドラ

DEF_EXC で指定する割込みハンドラ番号(excno)は，SH3 での 例外事象レジス
タに設定される例外コード番号を表し，そのデータ型(EXCNO)は unsigned int
型に定義されている．DEF_EXC で，例外コード番号として有効でない値や，
CPU例外に対応しない番号を指定した場合の動作は保証されない．

CPU例外ハンドラに渡されるp_excinfは，CPU例外発生時のコンテキストを保存
したスタックへのポインタが渡される．スタックの構造を以下に示す．

offset
          ----------------------
         |         R7           |  <-- p_excinf
          ----------------------
  1      |         R6           |
          ----------------------
  2      |         R5           |
          ----------------------
  3      |         R4           |
          ----------------------
  4      |         R3           |
          ----------------------
  5      |         R2           |
          ----------------------
  6      |         R1           |
          ----------------------
  7      |         R0           |
          ----------------------
  8      |        MACH          |
          ----------------------
  9      |        MACL          |
          ----------------------
 10      |        GBR           |
          ----------------------
 11      |         SR           |
          ----------------------
 12      |         PR           |
          ----------------------
 13      |         PC           |
          ----------------------

また，CPU例外発生時のPCの値は発生例外要因に応じてCPUによりインクリメン
トされる場合や，されずにリトライする場合がある．そのため，PCの値を変更
したい場合は，CPU例外ハンドラで，p_excinfを元にPCの値を変更すればよい．



2.4 スタートアップモジュール

SH3依存のスタートアップモジュール(start.S)では，次の初期化処理を行う．

(A) プロセッサモードの初期化とスタックポインタの初期化

最初に，すべてのキャッシュを無効化した後，キャッシュをライトスルーモー
ドに設定し，有効にする．また，プロセッサのモードを，特権モード，レジス
タバンク1に設定し，割り込みマスクを MAX_IPM に設定する．


次に，スタックポインタ(r15)を STACKTOP に設定する．ここで割込みスタッ
クポインタに設定されたスタック領域は，カーネル起動後は非タスクコンテキ
スト用のスタック領域として使われる．STACKTOP は，sys_config.h 部で定義
することを想定している．

(B) hardware_init_hook の呼出し

hardware_init_hook が 0 でない場合には，hardware_init_hook を呼び出す．
hardware_init_hook は，カーネルが起動される前に行う必要があるターゲッ
ト依存の初期化を行うために用意している．hardware_init_hook がどこでも
定義されていない場合，リンカでこのシンボルを 0 に定義する(リンカスク
リプト内に記述あり)．

(C) bssセクションと dataセクションの初期化

bssセクションをゼロクリアする．また，dataセクションを初期化する．

(D) software_init_hook の呼出し

software_init_hook が 0 でない場合には，software_init_hook を呼び出す．
software_init_hook は，カーネルが起動される前に行う必要があるソフトウェ
ア環境(具体的には，ライブラリ)依存の初期化を行うために用意している．
software_init_hook がどこでも定義されていない場合，リンカでこのシンボ
ルを 0 に定義する(リンカスクリプト内に記述あり)．

(E) カーネルの起動

kernel_start へ分岐し，カーネルを起動する．kernel_start からリターンし
てくることは想定していない．


2.5 レジスタバンク

例外ハンドラの入口を除き基本的にレジスタバンク0を使用している．レジス
タバンク1は r7 のみ例外/割り込みのネスト回数のカウント用に使用している．
非タスクコンテキストとタスクコンテキストの判別はこのレジスタにより行っ
ている．なお，スタブはレジスタバンク1のR0とR1を使用するため，このレジ
スタに書き込んだデータはスタブが呼び出されると破壊される．


2.6 MACH，MACL，GBR

gccでは，MACH，MACL，GBRはすべてスクラッチレジスタとして扱われるため，
関数呼び出しの前後では値は保証されない．そのため，例外/割込み発生時に
は，スクラッチレジスタである汎用レジスタR0〜R7と同様に保存している．
また，自らディスパッチャを呼び出しす場合は，関数呼び出しになるため，保
存していない．アセンブラのコードを使用する場合もこのルールに従う必要が
ある．


2.7 割込みハンドラ実行時の割込みマスク

SH3は割込み発生時，割込みマスクビット(I3〜I0)はプロセッサによって自動
的に設定されないため，ソフトウェアによって設定する必要がある．割込みハ
ンドラ実行時に設定する割込みマスクビットをカーネルに指定するサービスコー
ルとしてdefine_int_plevel() を用意している．このサービスコールの使用は
次の通り．なお，define_int_plvel()により割込みマスクビットを指定しなけ
れば割込みハンドラはディフォルトの MAX_IPM -1 のマスクで実行される．

 define_int_plevel  割込みハンドラ実行時の割込みマスクビットの指定

【C言語API】
  void define_int_plevel(UINT dintno, UW plevel)

【パラメータ】
  dintno    割込み番号
  plevel    割込みレベル

【機能】
  dintno で指定した割込み番号の割込みハンドラが実行される場合の割込み
  マスクを plevel にする．


３．システム依存部の機能

3.1 システムクロックドライバ

システムクロックドライバが isig_tim を呼び出す周期は，sys_defs.h 中の 
TIC_NUME と TIC_DENO で定義されている(標準は 1ミリ秒周期)．この定義
を変更することで，isig_tim を呼び出す周期を変更することができる．ただ
し，タイマの精度が 1μ秒であるため，1μ秒単位で端数になる値を設定した
場合には，isig_tim の呼出し周期に誤差が生じることになる．

3.2 性能評価用システム時刻参照機能

SH3依存部では，性能評価用システム時刻参照機能(vxget_tim)をサポートして
いる．性能評価用システム時刻の精度は 1μ秒単位であるが，タイマの現在値
を読み出すために一時的にタイマを停止させる必要があるため，vxget_tim を
呼ぶ度にシステムクロックが少しづつ遅れることになる．なお，SYSUTIM型は 
UD型(64ビットの符号無し整数型)に定義している．

3.3 シリアルインタフェースドライバ


Solution_Engine のシリアルインタフェースドライバは，スーパーI/O内蔵
SCI(CN3) をサポートしている．また，MS7727CP01のシリアルインタフェース
ドライバは，ST16C2550CQ48 をサポートしている．

3.4 メモリマップ

コード領域とデータ領域は各システム依存部の Makefile.config で，スタッ
クの初期値は，sys_defs.h で設定する．

・Solution Engine
  コード領域を 0x0c003000 〜 0x0c0fffff 約1MB，データ領域を 0x0c100000 
  〜 の約3MB，非タスクコンテキスト用のスタック領域を 〜0x0c3fffff に確
  保している．0x0c000000 〜 0x0c000fff は，GDBスタブのワークエリアとなっ
  ており，使用することができない．


・MS7727CP01
  コード領域を 0x0c003000 〜 0x0c0fffff 約1MB，データ領域を 0x0c100000 
  〜 の約3MB，非タスクコンテキスト用のスタック領域を 〜0x0c3fffff に確
  保している．0x0c000000 〜 0x0c002fff は，ROMモニタのワークエリアとなっ
  ており，使用することができない．


４．開発環境の構築

開発環境の構築方法については，GNU開発環境構築マニュアルを参照のこと．


4.1 開発環境のバージョン
動作確認したツールのバージョンは以下の通りである．

    BINUTILS : 2.10.1
    GCC-CORE : 2.95.3
    GDB      : 4.18
    NEWLIB   : 1.9.0

の組み合わせもしくは

    BINUTILS : 2.14
    GCC-CORE : 3.3
    GDB      : 5.3
    NEWLIB   : 1.11.0


５．その他

5.1 ディレクトリ・ファイル構成

SH3 ターゲット依存部の各ファイルの概要は次の通り．

    config/sh3/
        Makefile.config Makefileの SH3 依存定義
        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        低レベルのプロセッサ操作ルーチン
        start.S           スタートアップモジュール
        shelf.ld          ビッグエンディアン用リンカスクリプト
        shlelf.ld         リトルエンディアン用リンカスクリプト
        hw_timer.h        タイマ操作ルーチン
        sh3.h             SH3 の定義
        sh4.h             SH4 の定義


    config/sh3/solution_engine
        Makefile.config   Makefileの Solution Engine 依存定義
        ms7709ase01.h     MS7709ASE01 ハードウェア定義
        ms7729rse01.h     MS7729RSE01 ハードウェア定義
        ms7750se01.h      MS7750SE01  ハードウェア定義
        solution_engine.h Solution Engine共通定義
        sys_config.c      システム依存部の関数
        sys_config.h      システム依存部の構成定義
        sys_defs.h        システム依存部のアプリケーション用定義
        sys_support.S     システム依存部のサブルーチン
        sys_rename.def    カーネルの内部識別名のリネーム定義
        sys_rename.h      カーネルの内部識別名のリネーム
        sys_unrename.h    カーネルの内部識別名のリネーム解除
        hw_serial.h       SIOドライバ
        hw_serial.cfg     SIOドライバのコンフィギュレーションファイル


    config/sh3/ms7727cp01
        Makefile.config   Makefileの MS7727CP01 依存定義
        ms7727cp01.h      MS7727CP01 ハードウェア定義
        sys_config.c      システム依存部の関数
        sys_config.h      システム依存部の構成定義
        sys_defs.h        システム依存部のアプリケーション用定義
        sys_support.S     システム依存部のサブルーチン
        sys_rename.def    カーネルの内部識別名のリネーム定義
        sys_rename.h      カーネルの内部識別名のリネーム
        sys_unrename.h    カーネルの内部識別名のリネーム解除
        hw_serial.h       SIOドライバ
        hw_serial.cfg     SIOドライバのコンフィギュレーションファイル


    pdic/simple_sio/
        st16c2550.h       ST16C2550 の定義
        st16c2550.c       ST16C2550 用SIOドライバ
        fdc37c935a.h      fdc37c935a の定義
        fdc37c935a.c      fdc37c935a 用SIOドライバ



