Cyrix coma バグ
From Wikipedia, the free encyclopedia
動作原理
以下のようなインラインアセンブリを使ったコードが、非特権ユーザーによってコンパイル・実行できることが確認されている[1]。
unsigned char c[4] = {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は割り込みの効かない無限ループに陥り、リセットなどによるシステムの再起動以外で終了させることはできなくなる[注 3]。
このコードには割り込みを禁止する命令は含まれていないが、xchg命令が分割不能(アトミック)な命令のため、CPUはこの命令の実行中には割り込みを禁止するように設計されている。ところが、CPUの命令パイプラインと分岐予測により、最初のxchg命令の処理とその処理結果と依存関係にあるmov命令が完了する前に、jump命令の飛び先である次のxchg命令がパイプラインに入ってしまい、その結果割り込みが許可されるタイミングを失い、デッドロックを起こしてしまうと推測されている[1]。
ただし、実際にはコンパイラが上記のようなコードを出力することはないと思われ、アセンブリ言語で意図的に記述する以外では、この問題に遭遇することはないと考えられている。