chakokuのブログ(rev4)

日々のごった煮ブログです

DN-G200(OpenBlockSS)のBIOS(Monitor)を読む

なぜブートローダーを変更すると途端に動かなくなるのか?を調べるべく、電源投入後に走り出すDN-G200のBIOS(Monitor)を読んでみる事にした。推測ではDIP−SWを見て、全部OPENだったら、flashの先頭にjumpするだけと思っていたのだけど。。実際に読んでみるとかなり複雑で壁にあたる。。

Flashに焼かれている初期のBIOS解析するためにやったこと
(1) Linuxブートローダの先頭に細工してMMUが走る前の状態でBIOSのバイナリをシリアルにダンプ
(2) ダンプしたバイナリをIBMがリリースしているPowerPC 命令Simulatorで実行(ステップ実行で意味を推測しながら動作を確認)。上の図はシミュレータの画面
objdumpコマンドで逆アセンブルしてニーモニックを読みながらステップ実行


$ objdump -D -EB -b binary -m powerpc:403 -M power4 dn-g200_flash.bin --adjust-vma=0xfffe0000 > disas.txt
(3) シミュレータではシリアル出力とかできないのでメモリ領域にダンプするようにコードを修正
 つまり、、putc()相当の処理している部分をstrcpy()に変更

この結果、ブート時、表示しようとしている文字列は以下
(実機ではなぜシリアルに出力されないのか?までは不明)


***
*** IBM405GP Monitor (Ver. 1.8, REV-01 H/W) ***
*** Century Version (MA-300) (Oct. 30, 2001) ***
***
*** FLASH BASE is 0x00000000
*** FLASH SIZE is 2MBytes
*** MON SIZE is 128KBytes
*** FLASH TYPE is Top
*** SDRAM SIZE is 32MBytes
*** Abort Sw is ON (<<多分実機と異なる動作)
***
この後、ハードチェック等が続くようです。

壁な部分

(1)SimulatorではPPCに接続されているハードまではシミュレーションできない。だから、シミュレータと実機では動作が違う。本来ならループから抜けるはずのコードが延々と無限ループしている部分あり。
 一方、DN-200(OpenBloksS)のハード仕様は非公開。例えば、、DIP-SWはGPIOのどのピンが割り当てられているのか、7SEG LEDはどれが割り当てか?等、不明点多い。

(2)コードを読み続けているがさらに森の奥へと続いている。いつまで実行を追いかけてもLinuxのHead.Sにジャンプしない。。

最初はかなり燃え上がって取り組んでましたが、段々と火力も落ちてきました。。そもそも、Head.Sまでは飛んできていて、領域コピーしている所でこけている可能性もありまして、、このままBIOSを追いかけ続けるのが正しいアプローチなのか結構疑問になってきた。