\input texi @c -*-texinfo-*-
@c %**start of header
@setfilename gdb-sh.info
@settitle MICS SH-GDB Manual 
@documentencoding EUC-JP
@c %**end of header

@copying
Copyright @copyright{} 2007 Takefumi MIYOSHI, All Rights Reserved.
@end copying

@titlepage
@title MICS SH-GDB Manual
@page
@vskip 0pt plus 1filll
@insertcopying
@end titlepage

@c Output the table of contents at the begging.
@contents

@ifnottex
@node Top, MICS SH-GDB, (dir), (dir)
@top MICS SH-GDB Manual

@insertcopying
@end ifnottex

@menu
* MICS SH-GDB::                 
* 使い方::                      
* メモリフック::                
* チュートリアル::              
* 索引::                        
@end menu

@node MICS SH-GDB, 使い方, Top, Top
@chapter MICS SH-GDB

MICSのExecutableElementとして振舞うgdbのラッパーモジュールです．SH(ルネサス)シリーズの命令を解析し，外部メモリアクセスをフックすることで，サイクルレベルでのシミュレーションと外部モジュールへのアクセスを実現しています．

@node 使い方, メモリフック, MICS SH-GDB, Top
@chapter 使い方
SH-GDBでは，gdbプロセスを利用してSHプロセッサの動作をシミュレートします．現在のバージョンでは，リンク済みの単一のバイナリファイルを利用してのシミュレーションのみをサポートしています．SH-GDBでは，次のようにgdbを初期化し，以降siコマンドでプログラムが終了するまで，ステップ実行します．

@command{
(gdb)file 指定したファイル@*
(gdb)target sim@*
(gdb)load@*
(gdb)b main@*
(gdb)run@*
}


@section ローカルのgdbプロセスの利用
ローカルにgdbがある場合には，直接そのgdbプロセスをmicsの子プロセスとして起動し使用することができます．その場合には設定ファイルには，次のように要素の定義を記述します．
@example
@code{
  <element id="proc0"
           class="net.wasamon.mics.processor.gdb.SH3"
           type = "local"
           target="/home/miyo/a.out"
           gdb="sh-hitachi-elf-gdb">
    <channel id="bus1" offset="0x08000000"/>
  </element>
}
@end example

ここでシミュレーションの対象となるファイルには，ローカルのファイルパスを指定します．
@section リモートのgdbプロセスの利用
SH用のGDBを用意することが困難な場合リモートにあるGDBプロセスとXML-RPCを利用して通信することで，MICSエレメントとしてgdbを利用することができます．ホスト側では専用のサーバプログラムを実行する必要があります．
MICSでのシミュレーション要素の定義を次に示しています．
@example
@code{
  <element id="proc0"
           class="net.wasamon.mics.processor.gdb.SH3"
           type = "xmlrpc"
           target="l:\a.out"
           gdb="sh-hitachi-elf-gdb">
    <channel id="bus1" offset="0x08000000"/>
  </element>
}
@end example

ここでシミュレーションの対象となるファイルには，ローカルのファイルパスを指定します．MICSでは，XML-RPCで対象となるファイルをリモートのサーバに転送し，実行してもらいます．

また，gdbを起動する対象となるホストと通信に利用するポート番号を，次のように起動時にシステムプロパティ@var{net.wasamon.xmlgdb.host}と@var{net.wasamon.xmlgdb.port}で設定する必要があります．

@command{
java -Dnet.wasamon.xmlgdb.port=8192\@*
 -Dnet.wasamon.xmlgdb.host=192.168.5.169\@*
 -jar mics.jar
}

@subsection GDBサーバの起動
リモートホストでは，次のようにGDBサーバをあらかじめ起動しておく必要があります．実行の方法を次に示します．
@command{
java -Dnet.wasamon.xmlgdb.port=8192\@*
 -cp mics.jar:lib/commons-codec-1.3.jar:lib/xmlrpc-2.0.1.jar
 net.wasamon.xmlgdb.GdbServer
}
クライアントと同様に，システムプロパティ@var{net.wasamon.xmlgdb.port}でポート番号を指定する必要があります．また，XML-RPCには，Apacheのxml-rpcライブラリを使用しているので，適切にクラスパスを指定してください．

@node メモリフック, チュートリアル, 使い方, Top
@chapter メモリフックの仕組み
外部メモリへのアクセスを模倣するため，gdbでSIGBUSあるいはSIGEMTが発生した場合，そのアドレスへのあるいは，そのアドレスからのデータ転送を代替します．
GDBのSHシミュレータでは，エリア1以外へのメモリアクセスにおいてSIGBUSあるいはSIGEMTを発行するようです．現在MMUでのアドレス変換およびキャッシュのシミュレートは実装されていないので，MMUを有効にしたプログラムを実行することはできません．

@section 外部バスへのデータ転送

@section 外部バスからのデータ転送

@section シグナル受信後の処理

@node チュートリアル, 索引, メモリフック, Top
@chapter チュートリアル
実際にSH-GDBを利用するチュートリアルを示します．
対象とするアーキテクチャとして，2つのSH3プロセッサと，それぞれのプロセッサのエリア2のメモリ領域にCharacterDisplayをSingleDataBus16を介して接続したものを用意します．このアーキテクチャ定義ファイルを次に示します．

@example
@code{
<?xml version="1.0" encoding="euc-jp"?>
<mics>
  <element id="disp0" class="net.wasamon.mics.peripheral.CharacterDisplay" rows="2" cols="16"/>
  <element id="bus1" class="net.wasamon.mics.bus.SingleDataBus16" ram="disp0"/>
  <element id="proc0"
           class="net.wasamon.mics.processor.gdb.SH3"
           type = "local"
           target="/home/miyo/a.out"
           gdb="sh-hitachi-elf-gdb">
    <channel id="bus1" offset="0x08000000"/>
  </element>
  <element id="proc1"
           class="net.wasamon.mics.processor.gdb.SH3"
           type = "local"
           target="/home/miyo/b.out"
           gdb="sh-hitachi-elf-gdb">
    <channel id="bus1" offset="0x08000000"/>
  </element>
</mics>
}
@end example

またproc0で動作させるファイルa.outは，

@example
@code{
int main()
@{
	int i;
	int *a;
	a = (int*)0x08000000;
	for(i = 0; i < 26;i++)@{
		*a = i + 'a';
	@}
@}
}
@end example

を，proc1のb.outは，

@example
@code{
int main()
@{
	volatile int i;
	int *a;
	int d;
	a = (int*)0x08000000;
	for(i = 0; i < 100;i++)@{
	@}
	d = *a;
	for(i = 0; i < 26;i++)@{
		*a = d--;
	@}
@}
}
@end example

を，それぞれコンパイルしたものです．
MICSを起動し，このファイルを読み込みシミュレーションを実行すると，CharacterDisplayの二文字目に，proc0によって'a'から'z'が次々と表示され，その後proc1によって'z'から'a'が表示される様を観察することができます．

@node 索引,  , チュートリアル, Top
@unnumbered 索引

@printindex cp

@bye
