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

             （Release 1.4.1対応，最終更新: 6-Oct-2004）

------------------------------------------------------------------------ 
 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: m68k.txt,v 1.1 2009/01/31 05:27:37 suikan Exp $
------------------------------------------------------------------------


１．M68040 ターゲット依存部の概要

1.1 ターゲットシステム

M68040プロセッサのターゲットシステムとしては，(株)電産製の DVE-68K/40
CPUボード（CPU: MC68LC040）のみをサポートしている．

1.2 開発環境と実行環境

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

実行環境として，ROMモニタを用いる方法とGDBスタブを用いる方法をサポート
している．GDBスタブを用いる場合には，Makefile中で，DBGENVにGDB_STUBを
定義する（デフォルト）．ROMモニタを用いる場合には，DBGENVを定義しない．

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

M68040依存の機能として，割込みマスクの変更・参照（chg_ixx，get_ixx）を
サポートしている．また，DVE-68K/40 CPUボード依存の機能として，性能評価
用システム時刻参照機能（vxget_tim）をサポートしている．割込みの禁止と
許可（dis_int，ena_int）はサポートしていない．

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

現バージョンでは，FPUを持たないMC68LC040のみをサポートしている．FPUを
用いない場合には，FPU内蔵のM68040にも適用可能なはずである．FPUを活用し
たい場合には，ディスパッチャでFPUレジスタを保存／復帰する必要があるな
ど，若干の改造が必要である．

他のM68K系列のプロセッサへのポーティングについては，マスタスタックと別
に割込みスタックを持つM68020以降のプロセッサへは比較的容易にポーティン
グ可能と思われるが，それより前のプロセッサへのポーティングはやや面倒で
あろう．


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

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

2.1 データ型

signed int型，unsigned int型，size_t型のサイズは，いずれも32ビットであ
る．

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

カーネル管理外の割込みはNMIのみである．よって，CPUロック状態や初期化ルー
チン内では，NMI以外の割込みはすべて禁止されている．具体的には，IPM
（Interrupt Priority Mask）が7に設定される．

DEF_INHで指定する割込みハンドラ番号（inhno）は，M68040での例外ベクタ番
号を表し，そのデータ型（INHNO）はunsigned int型に定義されている．
DEF_INHで，例外ベクタ番号として有効でない値や，外部割込みに対応しない
番号を指定した場合の動作は保証されない．

M68040依存の機能として，SR（Status Register）中のIPM（Interrupt
Priority Mask）の値を変更するためのサービスコールchg_ipmと，参照するた
めのサービスコールget_ipmをサポートしている．なお，IPMの値を表すデータ
型IPMは，unsigned int型に定義されている．

これらのサービスコールは，タスクコンテキストでCPUロック解除状態の場合
にのみ呼び出すことができる．chg_ipmによりIPMを0以外（すなわち，何らか
の割込みが禁止されている状態）にした場合でも，ディスパッチは禁止されず，
chg_ipmにより変更したIPMの値は，ディスパッチ後のタスクに引き継がれる．
例えば，あるタスクでIPMを1に変更した後，何らかの割込みにより別のタスク
に切り替わると，切り替わった後のタスクでもIPMは1になる．ただし，IPMを0 
以外に設定していても，実行できるタスクがなくなった場合にはIPMは一時的
に0になる．これは，M68040の命令セットからくる制限事項である（解決手段
がないわけではない）．

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

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

(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〜6 以外の場合，E_PARエラーとなる．IPM を 1〜6 に設定した場合
でも，ディスパッチは禁止されない．また，設定した IPM の値は，ディスパッ
チ後も引き継がれる．ディスパッチを禁止したい場合には，dis_dsp と併用す
ればよい．

なお，このサービスコールを用いて，IPM を 7 （すべての割込みを禁止）に
設定することはできない．IPM を 7 にしたい場合には，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）は，M68040 での例外ベクタ
番号を表し，そのデータ型（EXCNO）は unsigned int型に定義されている．
DEF_EXC で，例外ベクタ番号として有効でない値や，CPU例外に対応しない番
号を指定した場合の動作は保証されない．

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

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

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

最初に，すべてのキャッシュを無効化した後，コードキャッシュとデータキャッ
シュを共に有効にする．また，プロセッサのモードを，スーパバイザモード・
割込みモードに設定し，NMI 以外のすべての割込みを禁止する．スタートアッ
プモジュールは，スーパバイザモードで起動しなければならないので，ここで
スーパバイザモードに設定するのは，本当はムダである．

次に，割込みスタックポインタ（SPI）を STACKTOP に設定する．ここで割込
みスタックポインタに設定されたスタック領域は，カーネル起動後は非タスク
コンテキスト用のスタック領域として使われる．STACKTOP は，sys_config.h 
部で定義することを想定している．また，フレームポインタを 0 に初期化す
る．

(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 からリターンし
てくることは想定していない．


３．DVE-68K/40 システム依存部の機能

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

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

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

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

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

DVE-68K/40依存部のシリアルインタフェースドライバは，DVE-68K/40 CPUボー
ドの2つのシリアルインタフェースをサポートしている．ポートID=1がポートB，
ポートID=2がポートAに対応している．ポートの割当てを逆にしているのは，
GDBスタブまたはROMモニタがポートAを使用するためである．

3.4 メモリマップ

DVE-68K/40依存部では，CPUボード上のメモリが4MBの場合を想定し，コード領
域を0x10000〜0xfffffの約1MB，データ領域を0x100000〜の約3MB，非タスクコ
ンテキスト用のスタック領域を〜0x3fffffに確保している．0〜0xffffの64KB 
は，ROMモニタまたはGDBスタブのワークエリアとなっており，使用することが
できない．


４．開発環境の構築

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

4.1 開発環境のバージョン

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

    BINUTILS : 2.13.2.1
    GCC-CORE : 2.95.3
    GDB      : 5.3
    NEWLIB   : 1.9.0

GCC 2.95.3では，アプリケーションが標準Cライブラリを使用しないなら，
NEWLIBは必要ない．

GCC 3.3を用いる場合，コンパイラが標準Cライブラリ関数を呼び出すコードを
生成するため，NEWLIBが必要になる．NEWLIBの標準Cライブラリをリンクする
ために，Makefile中のLIBSの定義に以下のように -lc を追加する必要がある．

    LIBS := $(LIBS) $(CXXLIBS) -lc -lgcc


５．その他

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

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

    config/m68k/
    Makefile.config MakefileのM68040依存定義
    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     スタートアップモジュール
    m68kelf.ld  リンカスクリプト

    config/m68k/dve68k/
    Makefile.config MakefileのDVE-68K/40依存定義
    sys_defs.h  システム依存部のアプリケーション用定義
    sys_config.h    システム依存部の構成定義
    sys_config.c    システム依存部の関数
    sys_support.S   システム依存部のサブルーチン
    sys_rename.def  カーネルの内部識別名のリネーム定義
    sys_rename.h    カーネルの内部識別名のリネーム
    sys_unrename.h  カーネルの内部識別名のリネーム解除
    hw_timer.h  タイマ操作ルーチン
    hw_serial.h SIOドライバ
    hw_serial.cfg   SIOドライバのコンフィギュレーションファイル
    dve68k.h    DVE-68K/40 CPUボードのハードウェア資源の定義
    dve68k_dga.h    DGAのアクセスユーティリティ

    pdic/simple_sio/
    upd72001.h  μPD72001用 簡易SIOドライバ関連の定義
    upd72001.c  μPD72001用 簡易SIOドライバ

5.2 ターゲットへのダウンロードと実行

ターゲットへのダウンロードと実行手順については，GNU開発環境構築マニュ
アルに説明されているが，以下では，M68040およびDVE-68K/40 CPUボードの場
合に特有の事項について説明する．

(A) ROMモニタを用いる方法

DVE-68K/40 CPUボードの場合，別売りのROMモニタとそれに対応した端末ソフ
トを用いると，Rコマンドでバイナリ形式のファイルをダウンロードすること
ができる．

    #R 10000
    \up jsp.bin

プログラムの実行は，gコマンドで行う．

    #g 10000

(B) GDBスタブを用いる方法

M68040では，プログラムを実行中にNMIをかける（DVE-68K/40 CPUボードでは，
ABORTスイッチを押す）ことで，プログラムを停止させて，gdbに制御を戻すこ
とができる．

以上
