1ヶ月ほど前からLinkStation/玄箱には、通常Linuxが起動するモードの他に、FlashROMから起動するデバッグモード(一般的にモニタープログラムなどと呼ばれています。)があると信じて様々な方法を試しながら探してきましたが、とうとうそれを発見することができましたので報告します。
LinkStation/玄箱は、Linux上の/dev/fl2に割り当てられているFlashROM領域から起動することはわかっており、この/dev/fl2領域をcatしたモノをバイナリエディタで眺めていたところ、
******* Product Information、Product Name:
などの起動画面で見慣れた文字列の他に、
[Alart mode]
のように、通常の起動画面では見ることのできない文字列が混じっていました。ま、AlartはAlertのスペルミスであることは置いておいて、Alert Modeを直訳すれば「警戒モード」。つまり、なんらかの原因でLinuxが正常に起動できない緊急時に、このAlert Mode状態にしてなんらかの作業ができると考えられます。
このAlert Modeに突入できれば、FlashROMの書き換えや、各種CPUレジスタのリード/ライトなどができるはずです。一番Alert Modeの入り口に近いと考えられるのが、起動直後、Linuxカーネルが実行される前の>>root=/dev/hda1が表示されてからの沈黙の5秒間です。この5秒間の間に何らかのキー入力をすればAlert Modeに突入できるのではないかと考え、すべての考えられるキー入力を試しました。単発入力、Shift,Ctrl、debugなどの文字列など。しかし一度もAlert Modeに突入することはありませんでした。
アヤいなと思っていたのは、root=/dev/hda1とデフォルトで入力されてしまう文字列。/dev/fl2のバイナリを見ても9000hという区切りの良い位置にこのデフォルト文字列が書き込まれており、この文字列を書き換えればAlert Modeの入り口が切り開かれるのでは…?と感じていました。が、何の確証もなく、試してみるには危険度が高すぎるため、試せずにいました。
半ばあきらめかけていたときに、山下さんBBSに、Alert Modeを考察するたつやさんの書き込みを見ました。デバッグモードへ入るには「debug」という文字列が必要、プリセットのroot=/dev/hda1が邪魔している、など、ソースを解析された結果を見て確信しました。root=/dev/hda1というプリセット文字列を消してみようと。
以下、相当危険な行為となりますので、試す方は自己責任でお願いします。結果的には、私はこの実験を通して、LinkStation、玄箱1台ずつ、再起不能にしてしまいましたので。
まず、吸い出した/dev/fl2の9000hにある、「root=/dev/hda1」という文字をすべて00hに書き換えます。このデータをcatで/dev/fl2に書き戻します。
実は私はこの時に1台、玄箱を昇天させてしまいました。/dev/fl2に書き戻す際、catを使えば良かったモノを、変に気を利かせて玄箱に入っている「as_flash」ツールのaddコマンドを使ってしまったのです。理由はわかりませんが、as_flashコマンドを使った時点で玄箱はフリーズし、その後電源を立ち上げなおしても二度と立ち上がらなくなってしまいました。/dev/fl2が壊れたのでしょう。/dev/fl2に書き戻す際は必ずcatするようにしてください。
この時点でもう吹っ切れていたので、何の躊躇もなく最後の1台、実験用のLinkStationの/dev/fl2を書き換えました。おそるおそる電源を立ち上げなおしてみると…。
******* Product Information *******
----------------------------------
Product Name: HD-HLAN(HIDETADA)
VER: 1.03
Date: 2004/3/5 14:37:34
----------------------------------
Firmware check:done.
>>
今まで、root=/dev/hda1と入力されてしまっていた領域が空になっています。ここに「debug」とキー入力してみると。
>>debug
[Alart mode]
#help
commands:
ledstop flash erasek writeb
writef mmb md help
quit
>RET:0
#quit
Now Loading...done.
Now Booting
Memory BAT mapping: BAT2=64Mb, BAT3=0Mb, residual: 0Mb
Linux version 2.4.17_mvl21-sandpoint (root@toda_dev.melcoinc.co.jp) (gcc version
やったー!!来ました。Alert Modeがその姿を現しました。quitすると普通にLinuxが起動してくることも確認しました。早速、コマンドの解析をしてみます。
#md
00000000 : AAAAAAAA 70000000 32000000 7E4F1B78
00000010 : 749E2378 38AD2378 77CC3368 7CDF3B78
00000020 : 3B4C0000 480E4A71 480037DD 49003769
00000030 : 400837BD 5A0C37F5 4A805F5D 387A1B78
00000040 : 3883C104 38C40000 40823378 7C0001A6
00000050 : 60C800B0 7C9903A6 3C00E100 600036CC
00000060 : 7B1E03AE 0C00006C 02000000 10001100
00000070 : 02000100 00400000 20000000 00000000
>RET:0
#md ff800000
FF800000 : 00000001 00000003 48442D48 4C414E28
FF800010 : 48494445 54414441 29000000 00000000
FF800020 : 00000000 00000000 464C4153 4820312E
FF800030 : 32000000 00000000 00000000 00000000
FF800040 : 00000000 00000000 00010003 00006803
FF800050 : 050E2522 002DEDA2 10109B52 0000006C
FF800060 : 000CCB05 000CCB71 00212231 1F8B0808
FF800070 : 1D124840 0203766D 6C696E75 7800EC5C
mdはメモリダンプのようです。
#flash
FUJITSU MBM29PL32TM
>RET:0
flashコマンドではFlashROMの型番が出てきます。
#writef
>RET:4
引数が足りないのでしょう。
#ledstop
>RET:0
不明。
問題は、AVRに対してのコマンドが発行されないため、1分ほどで強制的にパワーダウンしてしまいます。これはのちのち対策しないとダメです。
#erasek
あれ?無反応。アヤしい空気の中、コンセントを挿しなおしてみると…
******* Product Information *******
----------------------------------
Product Name:
VER: 65535.65535
Date: 1899/-1/-1 -1:-1:-1
----------------------------------
Firmware check:Fail!:invalid Firmware size
あちゃー、やっちまいました。。erasekコマンドはどうやらイレースカーネルのことだったようです。/dev/fl1が消えてしまったのでしょう。/dev/fl2は生きているので完全な死亡状態ではないのですが、この状態では/dev/fl1を書き込む手段がなく、事実上の死亡です。しかし、いったい何のためのAlert Modeなんだよ、まったく。。しかも、Sure?の一言ぐらい聞き返して欲しかった。。
2台のLinkStation/玄箱を再起不能にして、やっとフラッシュ書き込みへの本格的な始動となりそうです。どうせ、コンソール接続のための改造もしてしまっているので修理も不可能。これからは気兼ねなく徹底的に遊んでみようと思います。(タダでは転びませんよ。)