Hack BBS

[全部のスレッド一覧][新規投稿][記事の削除・変更] [Home Page]

返信投稿はタイトルのリンクをクリックして下さい
スレッド【No.678】の中の記事をすべて表示しています

【No.678】のスレッド
04/05/31(月) 16:58:03 投稿者[いかとん] [No.678]のスレッド内
【No.678】 タイトル[HDDスピンアップ時間不足でdiag6回] この記事がスレッドの最初です
はじめまして。

IBM-DTTA-371010を取り付け、電源投入したところ
HDDスピンアップ時間不足でdiag6回点滅で電源が切れます。
電源が切れた瞬間(HDDがまだ慣性で回っているうち)に電源ボタンを再度押すと
スピンアップ時間が足りるようで、正常に起動します。

Local Consoleで見ると電源投入後、root=/dev/hda1の状態で5秒待ちの状態がありますが、これを10秒とか15秒にできないものでしょうか。
/dev/fl2のパッチとかで何とかならないものですかねぇ・・・


04/05/31(月) 22:13:40 投稿者[たつや] <http://linkstation.yi.org/> [No.678]のスレッド内
【No.679】 タイトル[Re: HDDスピンアップ時間不足でdiag6回] 【No.678】に対する返信
>Local Consoleで見ると電源投入後、
>root=/dev/hda1の状態で5秒待ちの状態がありますが、
>これを10秒とか15秒にできないものでしょうか。
>/dev/fl2のパッチとかで何とかならないものですかねぇ・・・

できると思いますよ。
/dev/fl2 を書き換えて起動不能にした私の話でよければ
ですが :-)

機種が分からないので、HLAN シリーズの場合です。
ほかの機種も同様だと思いますが、アドレス等は当然変わっ
てきますので、ソースも必ず確認したほうがよいです。

arch/ppc/boot/misc-simple.c の関数 decompress_kernel()
の部分で、while ループの繰り返し数を変えればいいと思い
ます。

timer = 0;
while (timer++ < 1*1000) { ← ここ
if (tstc()) {
cp = input_cmd(cp,256);
break;
}
udelay(10000);
}

/dev/fl2 のバイナリでは、上記のソースは以下の部分にな
ります。ソースで 1000 回繰り返しの部分は 先頭から
0x2b1e バイト目の 2 バイトに入っていますので、ここを
3000 (0x0bb8) などに書き換えてあげればいいでしょう。

00802b08: 3b e0 00 00 li r31,0
00802b0c: 48 00 00 0c b 00802b18
00802b10: 38 60 27 10 li r3,10000
00802b14: 4b ff ea f5 bl 00801608 ; call udelay
00802b18: 7f e0 fb 78 mr r0,r31
00802b1c: 2c 00 03 e7 cmpwi r0,999
~~~~~ この2バイト
00802b20: 3b ff 00 01 addi r31,r31,1
00802b24: 41 81 00 20 bgt 00802b44
00802b28: 4b ff ec 29 bl 00801750 ; call tstc
00802b2c: 2c 03 00 00 cmpwi r3,0
00802b30: 41 82 ff e0 beq 00802b10
00802b34: 7f a3 eb 78 mr r3,r29
00802b38: 38 80 01 00 li r4,256
00802b3c: 4b ff f9 95 bl 008024d0 ; call input_cmd
00802b40: 7c 7d 1b 78 mr r29,r3
00802b44: 38 00 00 00 li r0,0

/dev/fl2 の書き換えはくれぐれもご注意ください。
書き込みに失敗しても、リブートしなければ何回でも書き
直しできますので、リブートする前に cmp 等を使って必ず
正常に書き込めたかどうかの確認を行ってください。

修正自体は危険な内容ではありませんが、書き込みに失敗
するとただの箱になってしまいます。失敗しても私は責任
取れませんので、くれぐれも own risk でおねがいします。

なお、念のため、Serial Console が使えるのなら、本当に
スピンアップ時間が問題なのか確認してみたほうがいいで
しょう。
疑っているわけではなく、(書き込まれた内容なら確かに
私もその結論に達するだろうとは思っています。)修正行
為自体が危険を伴うので念には念を、ということです。

serial console を接続して、電源をいれ、

>> root=/dev/hda1

が表示されたときに何らかのキー入力を行うと、起動タイ
マが停止します。ここでは、スペースを入力して、そのま
まの状態で 10 秒程度待ち、リターンキーを押すとブート
が始まります。この操作で正常に起動できるようなら、上
記の修正で直すことができるでしょう。
だめなら、もう少し時間を長する必要がありそうです。
待ち時間を長くしても起動できないなら、別のところに原
因があるかもしれません。

04/06/01(火) 12:21:15 投稿者[いかとん] [No.678]のスレッド内
【No.681】 タイトル[Re: HDDスピンアップ時間不足でdiag6回] 【No.679】に対する返信
いかとんです。
早速のレスありがとうございます。
機種を書くのを忘れていました、スイマセン。
機種は玄箱でHLANと同じでした。

早速2,3日中に実施したいと思います(今日は飲むのでちょっと・・・)
結果をまたご報告いたします。

04/06/02(水) 21:55:18 投稿者[いかとん] [No.678]のスレッド内
【No.684】 タイトル[Re: HDDスピンアップ時間不足でdiag6回] 【No.681】に対する返信
いかとんです。
結果報告です。
fl2を修正してroot=/dev/hda1の状態で10秒待機するようにしたところウマク起動するようになりました。
どうもありがとうございました。

04/06/09(水) 01:09:06 投稿者[MILK] [No.678]のスレッド内
【No.748】 タイトル[Re: HDDスピンアップ時間不足でdiag6回] 【No.684】に対する返信
はじめまして。

自分もいかとんさん同じHDDを使用しており、
同じ症状に悩まされておりました。

5秒待ちと1000回ループの関係が今一わかりませんが、
999の値を取り敢えず1999に変更すれば、解決致しました。

うれしかったもんで、報告させて頂いたしだいです。
いかとんさん、たつやさん。ありがとうございました。

04/06/09(水) 02:08:45 投稿者[たつや] <http://linkstation.yi.org/> [No.678]のスレッド内
【No.749】 タイトル[Re: HDDスピンアップ時間不足でdiag6回] 【No.748】に対する返信
>5秒待ちと1000回ループの関係が今一わかりませんが、
>999の値を取り敢えず1999に変更すれば、解決致しました。

おそらく適当です :-)

というか、本来、udelay という関数でマイクロ秒単位の wait
を作るはずなので、udelay(1000) で1ミリ秒、これを while
で 5000 回まわして 5 秒の wait を作っていたのだと思いま
す。(MontaVista のオリジナルソースではそういう値になって
います)

しかし、このソースが最初に書かれたマシンより、LinkStation
の方が CPU クロックが高いので、udelay が指定よりかなり速
く終了してしまうようになったのでしょう。
この場合、udelay を修正してnマイクロ秒で終わるようにす
べきなのですが、udelay はそのままにして udelay の引数を
10 倍して while ループの回数を 5 分の 1 するという適当な
変更をして待ち時間を作ってしまったのだと思われます。

結果として、正確に何秒とはいえないような待ち時間ができて
しまいました。しかも、この部分のソースは HLAN シリーズも
HGLAN シリーズも同じなので、両者のクロック周波数の違いに
より待ち時間も異なる結果になるのではないでしょうか。
(どなたか比較してみた方、いらっしゃいませんか?(笑)

04/05/31(月) 22:45:00 投稿者[谷本] <http://www.page.sannet.ne.jp/i-tanimoto/> [No.678]のスレッド内
【No.680】 タイトル[HGの場合] 【No.679】に対する返信
HGの場合ですが、ほとんど同じですね。
アドレスは変わっています。
それにしてもパワーPCはレジスタの数が多くていいです。
ペンティアムなど実質8個ですから。
でもペンチの方が圧倒的に速いのはご愛嬌です。

timer = 0;
while (timer++ < 1*1000) {
if (tstc()) {
cp = input_cmd(cp,256);
break;
}
udelay(10000);
}
*cp = 0;
puts("\n");

00002b80: 3be00000 li r31,0 timer(r31)=0
00002b84: 4800000c b 0x2b90
00002b88: 38602710 li r3,10000
00002b8c: 4bffea7d bl 0x1608 udelay()
00002b90: 7fe0fb78 mr r0,r31
00002b94: 2c0003e7 cmpwi r0,999  ★ここか
00002b98: 3bff0001 addi r31,r31,1
00002b9c: 41810020 bgt- 0x2bbc
00002ba0: 4bffebb1 bl 0x1750 ;;tstc
00002ba4: 2c030000 cmpwi r3,0
00002ba8: 4182ffe0 beq+ 0x2b88

00002bac: 7fa3eb78 mr r3,r29
00002bb0: 38800100 li r4,256
00002bb4: 4bfff91d bl 0x24d0 @@input_cmd
00002bb8: 7c7d1b78 mr r29,r3

00002bbc: 38000000 li r0,0 ;*cp=0
00002bc0: 3c600081 lis r3,129
00002bc4: 981d0000 stb r0,0(r29)
00002bc8: 386382bc subi r3,r3,32068
00002bcc: 4bffecd9 bl puts "\n"