Cyrix coma バグは、サイリックス製のCPUであるCyrix 6x86、6x86L、およびRev. 1.4までの6x86MXに存在する、CPUの設計上の不具合(エラッタ)の通称である。「coma」は「昏睡」を意味する医学用語で、特権をもたないコードが割り込みを無視する状態で無限ループに陥ってしまう状態を昏睡になぞらえている、11月13日の記事を参照。
発見の経緯 1996年頃、ロシア人で当時モスクワ在住のプログラマであったセルゲイ・シュティリョフが、アセンブリ言語を使用したIDEディスクのデバイスドライバの開発中に、この問題に気づいたとされる2000年代初頭までLinuxの開発やドキュメント整備などに関わっていた、アンドリュー・D・バルサ(Andrew D. Balsa)の報告による。Linux Documentation Project の協力者のページなどに彼の名前が掲載されている。。この件の詳細を当時西シベリアのオムスク在住だったアレクサンドル・コノセヴィチが調査し、当時ドイツのコンピュータ雑誌「c't」の編集者であったと連絡を取り合い、ポストと共同で執筆した記事が同誌の1997年13号に「Halloween bei Cyrix(サイリックスでのハロウィン)」というタイトルで掲載された。同記事の中ではこの現象は「Hidden-CLI-Bug(隠れたCLIバグ)」と呼ばれていた「CLI」は、x86アーキテクチャで割り込みを禁止する命令のニモニックである。。
動作原理 以下のようなインラインアセンブリを使ったコードが、非特権ユーザーによってコンパイル・実行できることが確認されている。unsigned char c = {0x36, 0x78, 0x38, 0x36}; // "6x86" int main() { asm ( " movl $c, %ebx\n" "again: xchgl (%ebx), %eax\n" " movl %eax, %edx\n" " jmp again\n" ); }6x86を使用したシステムでこのプログラムを実行すると、CPUは割り込みの効かない無限ループに陥り、リセットなどによるシステムの再起動以外で終了させることはできなくなるこれは、非特権ユーザーによるサービス停止攻撃が可能であることを意味する。。
このコードには割り込みを禁止する命令は含まれていないが、xchg命令が分割不能(アトミック)な命令のため、CPUはこの命令の実行中には割り込みを禁止するように設計されている。ところが、CPUの命令パイプラインと分岐予測により、最初のxchg命令の処理とその処理結果と依存関係にあるmov命令が完了する前に、jump命令の飛び先である次のxchg命令がパイプラインに入ってしまい、その結果割り込みが許可されるタイミングを失い、デッドロックを起こしてしまうと推測されている。
ただし、実際にはコンパイラが上記のようなコードを出力することはないと思われ、アセンブリ言語で意図的に記述する以外では、この問題に遭遇することはないと考えられている。
回避策 最も簡単な対応は、CPUコントロールレジスタ(CCR1)の4bit目(NO_LOCKビット)を1にして、xchg命令中のバスロックを解除することである禁止されていた割り込みが有効になった結果として、別の問題が発生する可能性はゼロではないが、ほとんどの環境では問題なく動作するとの報告がなされている。マルチプロセッサ環境では問題が出る可能性があるが、そもそも6x86はマルチプロセッサに対応していない。。先述のコードの場合、ループ内のmovl命令の対象をxchg命令とは独立したものにしたり、ループ内にnop命令など別の命令を追加することにより、割り込みが実行できる余地ができるただし、意図的にこの現象を起こさせるコードを抑制することはできない。。
当時サイリックスが非公式で配布していた対策プログラムでは、Windows/DOS用の実行ファイルを逆アセンブルして調査したところ、非公開のCPUコントロールレジスタを使用してxchg命令をデバッグ用のコードとして定義し、該当命令をシリアライズすることで対応していたことが判明している。
出典
注釈
関連項目
Pentium FDIV バグ Pentium F00F バグ
外部リンク
Cyrix chip hit by bug too (英語). CNET (1997年11月14日). 2026年3月21日閲覧。