明け方に帰って、また寝て起きて出社。日付け越え。死ぬかと思った。
gdbスタブにメモリ書きこみコマンドをインプリメントしてみました。
loadコマンドを使用してgdb上からバイナリを転送できそうな予感。
これがOKならばgdbサーバーっぽくスタブを動作させることで、
バイナリの送り込みから実行までの全ての操作をgdb上で行えそう。
何気にgooで「PowerPC,gdb,stub」のANDで検索をかけてみたところ、
最近では linux/arch/ppc/kernel/ppc-stub.c というカーネルデバッグ
スタブが存在しているようです。ベクタの0x700がSIGTRAPに決めうち
になっているのですが、良いのかしら?
にや。成功(^^)v。でもsc命令を実行してトラップ。うーん、sbrkです
か。システムコールはOSっぽい振る舞いをするようなスタブを用意する?
ちゅうか、それってOSそのものぉ みたいなぁ(笑)。という訳で
4/7あたりに戻る。そんな感じ。
日付け越え。13時間睡眠後、出社(T_T)。そして明け方まで仕事。
13時間睡眠後、出社(T_T)。
26日の謎と27日のうまくゆかない原因は、どちらも恐ろしく
しょーもないちょんぼだと判ってへこり。そんな感じで
ステップ実行とか変数表示とかもよさげ。
日付け越え。
うまくゆかず。色々網を仕掛けてみるもよく判らず。
日付け越え。
色々細かいちょんぼを見つけつつデバッグ。以下メモ。
lmw命令で rAに%r0を指定するとアセンブルでエラーするのですが、
それだとstmwでストアした全GPRをロードすることができません。
エラーを取るために取り合えず lmw %r1,0x84(0) とかやって%r0が
壊れていることに気づかず無駄な時間を過ごす。
プログラム例外でSRR0に入る値が例外の起こった命令を指すか、次に
実行すべき命令を指すかは、トラップしたときのSRR1.bit15を調べれば
良いらしい。
gdbでのステップ実行プロトコルでは1命令単位のステップ実行を
行う。gdb上でのsコマンドによるCソースコードに対応する1ステップ
(一行)は、gdbが一行に対応する命令ステップ数回だけ's'プロトコルを
流してくることで自動的に対応付けられる。
ステップ実行を実現する場合、スタブの例外ハンドラが返すgdbへの
シグナルはSIGTRAPを返すこと。gdbのビルド時にインクルードされる
sys/signal.hで定義された値を返すこと。クロスライブラリで
インクルードされるsys/signal.hとでシグナルの対応する値が異なる
場合、スタブでSIGTRAPを返したつもりでも、gdbは異なる解釈を
するかも知れない。
何故か一発目の 0x201c34 でのbleがTrueにならない。謎。
for( i=0 ; i<256 ; i=i+2 ){ 201c24: 38 00 00 00 li r0,0 201c28: 90 1f 00 08 stw r0,8(r31) 201c2c: 80 1f 00 08 lwz r0,8(r31) 201c30: 2c 00 00 ff cmpwi r0,255 201c34: 40 81 00 08 ble 201c3c201c38: 48 00 00 24 b 201c5c
日付け越え。
うーーん、なんかうまくいかんのぅ。
Cygwinの1.3.1がリリースされました。1.2.xをジャンプしているのは
なぜなのでしょう?(^^; 1.1.8のリリース版だと挙動が怪しい節が
あったのでスナップショットを使用していました。普通に使う分には
何の問題もないのですが、シリアルアクセスを行うとデバッグモード
臭いメッセージが出てきていやんな感じだったのが、解決されて
いい感じ。
日付け越え。でもいつもより早め。
環境マニュアルには無いインプリメントなのですが、603eやら750やら
にはIABRというブレークポイント設定レジスタがインプリメントされて
いるのを発見。これを利用すればステップ実行の実現が簡単にできそう。
と思ったら、InsidePPCには、例外発生時には割り込みのかかった命令の
次に実行すべき命令のアドレスがSRR0に格納されるように書かれている
ものの、603eのユーザーズマニュアルには(IABRのアドレスと)一致した
命令が実行される前にトラップするようなことが書かれていて食い
違っている様子。ただ、前者の場合は先日述べたように、現在地の計算を
行う際に、ブランチ命令の飛び先でないことが条件になるという話が
あります。後者の場合は実行する命令がブランチ命令で無いという条件が
満たされないと次に飛ぶ先を知ることは不可能となります。むぅ。
PPCのUISAモデルではトレース例外というのが用意されてはいるの
ですが、こちらを利用する事を考えた場合、MSR.SEを立てた次には
例外が発生する為、いきなりそこらへんで立ててはダメで、rfiで
SRR1の内容がMSRに復元される事を利用して予めSRR1の内容を操作して
おくという方法を取る様にしなくてはならないかと思われます。
うーん、ちゃんと例外ハンドラを用意するなら、トレース例外を利用した
方が綺麗で簡単そう。トレース例外の場合、トレース例外以外の例外
が発生すると無効となってしまうので、例外ハンドラ中のコードを
デバッグするような場合はIABRを利用しないとダメな感じになるの
でしょうか。
日付け越え。トゥナイトIIも終わった時間が続くと曜日も判らなく
なるのでいかんです。
先日の例外発生時に保存されるアドレスはどうやらtrapや
illegal instructionの場合もその命令自身のアドレスを指している
みたい。環境マニュアルとか読んでもそのような感じでは書いてない
ような予感が(第六感で英文読むなよ)するのですが....ちゅうか、
trap命令実行時のSRR0に入るアドレスの説明が無いような。
あと、例外発生時はMSR.FPが0となる場合がほとんどのようで、
レジスタ表示用にFPRの内容をメモリにストアする必要のある場合
はMSR.FPを立てる必要があるみたい。
思いっきり昼過ぎまで寝る。
色々試して、どうにかパケット自体の受け渡しはうまくいっている模様。
あとは正しいデータを渡す様に例外ハンドルを修正すれば良いのかしら。
とかやっていると本物お仕事でやっとかないと死ぬかもしれないくらい
まずい事を忘れていたのを思いだし慌てて出社。事無きを得ていた模様
でほっと一安心。
帰りに本屋。やっぱりgdb関連書籍は見当たらず。ふと「大特集 プロギアの嵐」
の文字が目に入ったので、初めて「ARCADIA」を手にとってみました。
開発者インタビューはちょっと面白かったかも。
はて、gdbでのブレークポイントの設定なのですが、trap命令を元のセット
したい命令と置きかえるのは仕方ないとして、PowerPCでは例外を発生させた
命令のアドレスというのはどの様に知れば良いのかしら?例外が起こった
時に例外の起こった命令のアドレスが格納されるのは、マシンチェックと
浮動小数点使用不能例外だけで、他は例外の起こった命令の次の命令の
アドレス、つまり例外から戻るアドレスしか判りません。ブランチ命令の
飛び先アドレスにブレークポイントが設定されないという前提ならば、
単純に次に実行する命令から4を引いた値が例外の起こった命令の
アドレスとなるのですがそれを期待しても良いのかしら?それともLRの
値を見て色々考えれば判る?うーむ。
起きたら16:00で13時間寝てるんですが(激汗; 寝溜めはできないのに、
疲れは溜まる。人体の不思議。
gdbは結局tclのmakeを外すことができづ。gdbの方を--without-Xとかやって、
用事のあるディレクトリを手でmake実行。とりあえずできた予感。PSIMは
ターゲットにpowerpcを指定したら、他は何もしなくても取りこまれる様に
なっているみたいです。
gdb-stubのお勉強。
とかやっていたら、テレビ朝日の新番組(二回目)「これマジ」が始まり
ましたよ。宇宙人の映像って.....う、嘘くせぇ...... IDNだかなんだか
の略語を一部の人しか知らないことをいちいち説明できる時点で既に
誰でも判る情報なんでないのか?とか謎めいた番組でした。それよりも、
パチンコ(ブンヤという方言のやつ)名人の方がすげーと思いました。
で、gdb関連書籍を探しに本屋に。少し前まで動物本で置いてあったように思うの
ですが、すっかりなくなっていますよ。そういやいつのまにかLinuxやら
の関連書籍の枠が広がってて、特定分野向けの専門書枠が狭くなって
いるのに気づく今日この頃。しかた無いのでケロロ軍曹(3)をゲットして離脱。
ゲーセン。「プロギアの嵐」とか。ちょっと見た所、爆発パターンとか、
キャラデザとか、ずんどこの敵グラフィックやら、CAVEテイスト溢れている
感じがしたので、それを確かめるためオープニングをみようと、人の切れる
のをみていたのですが、やっと見たオープニングのCAPCOMの文字の次に
CAVEのあのロゴが上がってきたので、それに満足してやらずに離脱(ぉぃ;
gdbスタブを実際に書いてみているところ、レジスタとかアーキテクチャ
依存のデータをどうやって受け渡すべきなのか判らず。はて、どうすれ
ば良いのやら。
あ、彩の新版がやっと出そうな模様。連休前に出てくれると良いなぁと
言っておくテスト(^^;。
日付け越え。
gdb-5.0のコンパイルなど。configure,makeを実行したところ、
tclディレクトリのmakeでずっこけました。へこり。あまりにconfigure
にかかる時間が長過ぎるため、--without-tclとかやって今日はもう
寝ます。
日付け越え。
ネット接続できないし。
だらだら起きてリモートデバッグを行うときのgdbの使い方のお勉強。
例外ハンドルを行うスタブとシリアル経由で文字を送受信できるしかけ
さえ用意すれば良いみたい。非常にシンプルなインターフェースなの
が良い感じ。
とかやってたら、あの「G-taste」のドラマが始まりましたよ!ちゅうか、
釈由美子のナビゲートであのG-tasteが始まるとはどういう事?!
あのG-tasteを実写でっっ!! こいつぁ観るしか!!!と、思わずみて
みたところ、ただの短編恋愛ドラマで
かなり
ガッカリ。ちゅうか、あまり
にべたべた過ぎる為、違う恥ずかしさが溢れています(ぉい;
テレビ朝日だし、まぁこんなもんかな。原作のまんま実写に
したら放送できないだろうし、仮に放送できる線までもっていった
とすれば、こんな時間じゃもったいないでしょう(ぉぃぉぃ;.....)
原作を知っている人はどのようにブレークダウンされているか見比べて
みるのも一興かも。知らない人は、普通に寝て明日に差し支えの無い
生活を送るのが吉でしょう(^^;
日付け越え。つーか、GAME WAVE真っ最中の時間なのですが(-_-;
なにげにgdbに取りこまれているPowerPCシミュレータのPSIMのコード
を眺めてみたり。保留された例外はキューイングされるような仕組み
になっている予感。
日付け越え。
調査の続き。謎めいた感じになる過程は判ったものの、原因を取り除く
方法がいまいちわからず。
眠りが浅くて一日死にそうでした。でも限度を越えて起きているとかえって
目が冴えたりして。
ちょっと調査。む〜〜ん?謎めいた動きになってるような。
昼起床。そして出社。帰ってきたら2時過ぎているのですが。
Auge.さんところで進められているppcsim on FreeBSDでの話。私の方でも
ちょこっと調べてみました。fstat()については、実行されて成功するが
構造体自体は変化無しということで良さそうです。単にstdoutがオープン
されているかを調べているだけの様なので、fstat()の戻り値が0であれば
fd=1(stdout)に向かってwriteするというだけの仕掛けの様です。結果、
「たまたま」っぽい感じがしなくもありませんが、printf()(実はputs())はうまく
いくものと思われます。
この辺、調べていてprintf()がputs()に置きかえられているのに驚きました(^^;
恐らく、引き数無しprintf()が置きかえられているものと思われるのですが、
流石にここまでやるとソース通りになっていないという点でやり過ぎな感じが
しなくもありません(^^;。どこでputs()に変えられてしまうのか、自前で
作ったprintf()関数で、puts()に置きかえられない様な場合はどうなるのか、
調べておきたいところです。
整数の0除算については、PowerPCでは本当に例外にはならないようですね(^^;
浮動小数点ではMSRの設定で例外のON/OFFはできるようですが検出は可能。
因みに先日のコードをCygwinネイティブ実行してみると、
test> ./a.exe 100418 [main] a 3946961 handle_exceptions: Exception: STATUS_INTEGER_DIVIDE_BY_ZERO 101843 [main] a 3946961 stackdump: Dumping stack trace to A.EXE.stackdump
test> perl $a=0;$b=0;print $a/$b Illegal division by zero at - line 1.
13時間睡眠。すっかり夕方。でも出社(T_T)。そして半徹夜。
整理の続き。まぁこんなもんかな。
起きていたら週間少年マガジンで連載されている(らしい)マージャン
漫画のアニメをやってました。マージャンはよく判らないのですが、
いくらギャンブラーとはいえ、積み込みや牌のすり替えは「イカサマ」
なのではないでしょうか?(^^; なんか面白かったので別に良いですが
(ぉぃ;
起きられず。でも起きて出社。
まとめて割り込みシミュレートするのは意外と使いでが無いといいますか、
そんな感じなので、割り込み毎にENABLE/DISABLEを切り替えられる様に
整理。
日付け越え。今週はもう燃料切れ気味
gzip.cのabort_gzip()を参考にシグナルハンドリングしてみ
ました。Cntl-Cで止めてコマンド受け付け状態に戻るので、
無限ループ状態に陥っても安心です。ちゅうかこれが普通?(^^;
例外シミュレートを行うと、例外ハンドラにバグがある場合、
先日のようなハング状態に陥る事が多々あると思われるので、
そのような致命的なバグの調査には重宝するかも。
例外シミュレートはするつもりが無かったので、命令フェッチ
は必ず成功するものとして対応していたのですが、命令フェッチ
時の例外も検出するとなると、現在は命令フェッチ部分が命令実行
部分と分離しているため、命令フェッチ時のアクセス例外などの
対応があまり美しくない状態になっているのをどうにかしたい
気分。
日付け越え。
例外処理の仕込み完了。ステップ実行で取りあえずチェック。
OKそう。うっかり未定義な命令を実行したところ、プログラム
例外で0x700番地にジャンプしたのですが、そこでも未定義な
命令を実行して再び0x700番地にジャンプ......を繰り返して
しまいました(^^; いわゆるハング状態のシミュレートもOK(笑。
問題はCntl-Cで止めるとppcsimの実行が終了してしまうところ。
signalハンドルする必要ありです。
日付け越え。
例外処理の仕込み。scのOSシステムコールエミュレーションと本物
の挙動を切り替えるために、go_cmd.cやらで命令実行の戻り値ハンドル
に同じようなルーチンを並べていたのを例外処理関数としてまとめる
事にしてみました。ちょっとだけすっきりしたような気分。
例外を整理していて、整数除算命令で除数が'0'の場合の挙動がほった
らかしになっていたので、プロ環を調べてみたところ、じぇんじぇん
違っていることが今更発覚(^^; プロ環での動作を解釈するに、
0除算を行った場合は、CRのOVビットを見てプログラムで例外ハン
ドルする必要があるように思うのですが、以下のようなコードを
書いてみた所、
int div0(int a) { return(a/0) ; }
200000: 38 00 00 00 li r0,0 200004: 7c 63 03 d6 divw r3,r3,r0 200008: 4e 80 00 20 blr
日付け越え。
例外処理を仕込んでみることに。といっても、必要なのはシステム
コール例外とデクリメント例外だけな予感なのですが。
PowerPCでは、例外ベクタは0x100〜0x1x00くらいまでしか使用しな
いので、
.org 0x100 vec0100: /** System Reset Exceptions**/ b handle_system_reset .org 0x200 vec0200: /** Machine Check Exception **/ b handle_machine_check .org 0x200000 .section ".text"
昼過ぎまで寝てだらだら。今日は暑いっす。
いつも助言をいただいている
Auge.さんとこ
でppcsim on FreeBSD のビルドが行われているようです(^^) 以下、
私自身の為のメモも含めて謎への回答です。
io.h不要、LITTLE_ENDIANは定義済み、LITTLEで無いときの
fetchf4bの誤り、proff誤記については、検討&修正の参考にさせて
いただきたいと思います。traceについては、execコマンドでは
使用できるものの、go/stepコマンドでは効かないなど、仕様が
中途半端なので、とりあえず無いものとしたのでした(^^;
statについては、FreeBSDでのそれをうまくひっつけ合わせる必要
がありそうですね。CygwinはnewlibをCライブラリとして使用して
いるので、stat構造体のメンバーの並びは同じなのです(^^;
ある意味ラッキー、ある意味ポーティングを難しくしている部分
かも知れません。
逆アセンブルについては、binutilsのクロス環境をビルドする事
を強くお勧めします。逆アセンブル機能については、付けるのが
面倒というのもあったのですが(^^;objdumpが存在しているため、
わざわざ逆アセンブル機能を付ける必要が無かったというのが
理由です(ブレークポイントを設定するにはobjdumpの逆アセンブル
を使用しないと、リンク後どのオブジェクトがどこにマッピング
されるかわからない→ブレークポイントを設定しようとする
限り、ほぼ必ずobjdumpを使用する→逆アセンブルリストがある
ならば、その場で逆アセンブルする必要はほぼ皆無という経緯)。
他、実機にはそんな機能は無いとか、あまりに便利にし過ぎて、
実機での開発手法の開拓になんの役にも立たないのでは意味が
無くなるなど、もろもろ。
ppcsimよりも先にbinutilsやgcc,newlibのドキュメントを出した
のは、その辺を準備しておかないとppcsimで遊ぶのはほぼ不可能
という意図があったりなかったり(<どっちや)
そんな感じなので、もう少し格闘してみてください(笑
休出&日付け越え(T_T)。
Cでのアセンブラ記述の方法やらを調査。アセンブラに渡すソースを
そのまま記述するようなイメージになっているようです。
ごく小さな部分をチューニングのためにちょこっと書くには良い感じ
なのですが、asmマクロに文字列として渡しているようなイメージなの
で、アセンブラソースをprintfで生成しているような感じに思えて
きて、量が多くなると記述すること自体が面倒になってきていまいち。
また、gcc -c でコンパイルした時、プリプロセッサは通るけど
アセンブラでエラーした場合に、テンポラリにオープンされた
アセンブラソースファイルのエラー行番号をメッセージとして出して
くるため、デバッグ的に面倒かも(^^;
日付け越え。
ちょろっとコーディング。うーむ。実際に書いてみると全然練られて
いないことがボロボロ露呈してダメダメ。
プロバイダからアクセスポイント一覧の更新のお知らせメール。
おや?いつの間にか川崎APが設置されているじゃないですか!
ということはフレッツOKってこと?
日付け越え。
あまりの眠さに死亡
日付け越え。つーか、トゥナイトIIが終わってるんですけど(汗;
だらだら起きていたら、テレビ朝日の「Ds Garage」が始まったの
ですが、思いっきりリニューアルされていました。つーか、
なんだかつかみ所のない、よく判らない番組になっている感じ。
投稿CG作品の紹介はあるものの、コメンテーターがいなくて、
ただ流れているだけになっているのがなんだかいまいち。
TBSのCGTV(旧 電画な)の方が、毒を吐く(でも、技術的)コメンテータ
がいるので、番組としてはこちらの方が良い気がします。
日付け越え。
割り込みの仕組みの勉強を少し。
日付け越え。
カーネルの勉強など少し。
本日は実装CAD氏のお誘いで久しぶりに東京ゲームショーに行って
まいりました。以下、見てきた様子や感想など。
出るのが遅かったので渋滞にはまり、到着したのは14:00頃でした。
全盛期だった3年くらい前は長蛇の列に並んで死ぬほど待たされて
途中大混乱でちびっこが大暴走し始めたりとすごかったのですが、
すっかり静かになっているような感じでした。ブースの地図
を置いてきてしまったため、以下覚えているものだけ(^^;