HN 日本語サマリー

← 一覧へ戻る
プログラミング

ThinkPad I9990303 エラーのジレンマ

ThinkPad I9990303 Error Catch-22 (os2museum.com)

33 pointsby userbinator5 コメント

要約

1994年製のThinkPad 750Cで発生するI9990303エラーは、BIOSのフラッシュメモリ破損が原因で、通常はBIOSの再書き込みで解決できます。しかし、このエラー自体がBIOSの再書き込みに必要なシステム管理機能(バッテリーチェックなど)を無効にしてしまうため、通常の手段では修正が不可能なジレンマに陥ります。筆者はBIOSアップデートユーティリティを解析・改変し、これらのチェックを回避してフラッシュを成功させ、問題を解決しました。

全文翻訳

ThinkPad I9990303 エラーのジレンマ

私が所有する、1994年頃のIBM ThinkPad 750C(33MHz Intel 486SLプロセッサ搭載)は、かつては動作していましたが、現在はI9990303というエラーが出て起動しなくなりました。このエラーは、ラップトップが通常起動するのを妨げるだけでなく、BIOSセットアッププログラムに入ることもできなくします。これはかなり珍しいことで、他の多くエラーはBIOSセットアップに強制的に入らせます。

[画像:エラー画面]

「正常に起動する」というのは、特別にマークされたフロッピーディスクから起動できるという意味です。例えば、IBMのメンテナンスディスクやBIOSアップデートディスクなどです。そのようなディスクから起動すれば、DOSにアクセスでき、内蔵ハードディスクやPCカードにアクセスしたり、Windows 3.1を実行したりできます。つまり、ラップトップに深刻な問題があるようには見えません。

しかし、BIOSセットアップを実行できないため、ラップトップを適切に設定することができません。これが(おそらく)PS2ユーティリティなどが失敗する原因の一つでもあります。では、このエラーは何を意味するのでしょうか?

ThinkPad 750のIBMハードウェアメンテナンスマニュアルによると、I9990303エラーはシステムボードの故障を示します。また、次のような興味深い注記があります。「I9990303エラーは、強力な磁場への曝露によって引き起こされる可能性があります。」

新しいThinkPad(例: 760)では、I9990303エラーは「Bank–2 flash ROM checksum error」として記録されています。エラーの原因が、ファームウェアが部分的に破損していることである可能性は十分にあります。実行時BIOSは正常だが、ROMのセットアップと診断が破損している場合、このエラーがBIOSセットアップへのアクセスを妨げる理由を説明できます。

明らかな解決策はBIOSを再フラッシュすることですが…残念ながら、それはうまくいきません。BIOSフラッシュユーティリティは充電されたバッテリーを必要としますが、私にはそれがありません。しかし、そこまで到達すらできず、「システム電源管理が無効になっています」というエラーメッセージで失敗します。これは、PS2ユーティリティが機能しないのと、おそらく同じ根本的な問題です。つまり、BIOSアップデートはバッテリーの状態を確認する段階にすら到達せず、その手前で失敗してしまうのです。

そして、ここにCatch-22(ジレンマ)があります。BIOSフラッシュストレージのクリティカルではない部分が破損しており、これはBIOSの再フラッシュでほぼ確実に修正できるはずです。しかし、IBMのBIOSアップデートツールは、フラッシュの破損によって引き起こされたエラーのために機能しないのです。

どうすれば抜け出せるか

回避策はありますか?システムによっては、チェックなしでファームウェアアップデートユーティリティを直接実行できる方法があるかもしれません。ThinkPad 750Cではそのような幸運はありませんでした。アップデートフロッピーはカスタムシェル(アップデートユーティリティを直接実行するCOMMAND.COMの代替)を持つ起動可能なDOSディスクにすぎませんが、UPDTFLSH.EXEツールには調整できるような明白なオプションはありません。

ユーティリティはすべての前提条件をチェックし、実際のフラッシュを実行します。私の知る限り、コマンドライン引数は受け付けず、環境変数も参照せず、その動作を制御する方法は明らかではありません。

明らかな解決策は、チェックをスキップするようにアップデートユーティリティを修正することです。もちろんリスクは伴います。チェックがあるのには理由があるからです。しかし…十分な充電バッテリーがないデスクトップマシンでBIOSをフラッシュしたことがありますか?おそらくありますし、問題なく動作したはずです。

フラッシュメモリにBIOSを持つ古いシステムは通常、安全策がなく、「ブートブロックBIOS」もありません。BIOSアップデートが失敗した場合(例: 電源喪失)、システムは確実に起動不能になります(bricked)。そのため、ラップトップはしばしば充電されたバッテリーを要求します。これは、電源が失われた場合(BIOSアップデート失敗の最も可能性の高い原因)の安全策として役立つからです。

しかし、私はラップトップがすでに壊れているので、修理を試みる価値はあると判断しました。UPDTFLSH.EXEユーティリティを分解し、文書化されていない、あるいは全く文書化されていない多くのことを行っていることを発見しました。幸いなことに、エラーメッセージはコードが何をしているかについてかなり良い手がかりを与えてくれました。

ThinkPad 750Cは486SLプロセッサを使用しており、電源管理を実装するためにSMM(System Management Mode)を使用しているようです。Ralf Brown's Interrupt Listに部分的に文書化されているインターフェースを使用しています。UPDTFLSH.EXEはINT 15h/5380hをBH=7Ehで呼び出します。これは、BXに「SLコントロールポート」を返すと報告されています。

次に、ユーティリティはCH、CL、BLをASCIIの文字「I」、「B」、「M」である49h、42h、4Dhに設定します。
AXは(再び)5380hに、BHはF0hに設定され、その後、前の呼び出しから返されたSLコントロールポートが「OUT DX, AX」を介して書き込まれます。これはおそらく何らかのプレゼンスチェックです。

これは電源管理BIOSへのインターフェースだと推測しています。ソフトウェア割り込みのように機能しますが、処理がSMM(別のメモリアドレス空間)で実行されるため、I/Oポートの書き込みによってトリガーされます。

OUT命令がキャリーフラグを設定しない場合(ソフトウェア割り込みのように機能すると言いました!)、プレゼンスチェックは成功し、フラッシュユーティリティはさらなる電源管理要求を発行します。

これらは、ThinkPadが拡張ユニット内にあるかどうかをチェックします(何らかの理由でBIOSフラッシュにはNGです。おそらく、その場合、電源喪失をバッテリーで克服できないためです)。また、ラップトップにバッテリーが搭載されているか、バッテリーに十分な充電があるかをチェックする他のルーチンもあります。

ちなみに、ThinkPad 750Cは、初期のIBMポータブルと同様に、技術的にはPS/2マシンです。ただし、ThinkPad 700/720や古いIBMラップトップが使用していたMicrochannelは使用していません。750CのモデルバイトはF8h(サブモデルは61h)であり、これはすべての32ビットPS/2システムで使用される値です。これは、ThinkPad 760以降のモデルでも使用されていたPC/AT互換機で使用されていたモデルバイト(FCh)と同じではありません。ISAベースのPS/2モデル(例: Model 30)は珍しくありません。また、PS/2 E(Model 9533)のような32ビットISAベースのPS/2システムもありました。

しかし、フラッシュユーティリティに戻りましょう。私は、最初のコードセグメントのオフセットCC4hにあるルーチン全体を、常にAXにゼロを返すようにパッチアウトすることにしました。ハッキングされたユーティリティをBIOSアップデートディスクにコピーし、ラップトップを起動して何が起こるかを確認しました。ユーティリティはEXEPACKされていたため、展開して再パックする必要がありましたが、それは退屈な作業です。

ハッキングされたBIOSアップデートユーティリティは、実際には電源管理関連のエラーを回避し、フラッシュアップデートプロセスを開始させてくれました。何が起こるか全く確信が持てませんでしたが、実行させました。

[画像:アップデート中の画面]

フラッシュが完了した後、ラップトップは自己再起動し、この見慣れたエラー画面で私を迎えました。

[画像:ハッピーフラッピングダック]

成功です!I9990303エラーは消え、BIOSセットアップに入ることができ、ラップトップは正常に起動するようになりました。BIOSはすべてを設定できるようになり、CMOS内容の喪失によって引き起こされたエラー161と163も解消されました。PS2ユーティリティも再び動作するようになりました。

要約

1990年代中期のThinkPadで発生するI9990303エラーは、ほぼ間違いなくフラッシュメモリの破損を示しています。EPROM/フラッシュメモリは永遠に持続するわけではなく、時々ビットが「忘れる」ことがあります。これは通常、内容を書き換えることで修正できます。しかし、I9990303エラーの場合、BIOSをフラッシュすることで修正できる問題が、実際にはBIOSのフラッシュ自体を妨げてしまうという、ほぼ間違いなく意図しない副作用が生じます。

ハッキングされたUPDTFLSH.EXEユーティリティを使用することで、チェックをバイパスし、BIOSをフラッシュすることが可能になります。フラッシュが成功すると、I9990303エラーが解消されます。