1996年以来、デンマークのプログラマーAgner Fogはx86命令の実行レイテンシを1命令ずつ測定し、テーブルとして公開し続けてきた。IntelやAMDが公式に出す数値と実測値のズレを埋め、コンパイラ開発者やアセンブリプログラマーが1サイクルでも削るために参照する事実上の標準リファレンスだ。この分野の方向は一貫している。いかに速くするか、だ。

2026年8月7日、Christopher Domasはそのベクトルを真逆に回転させた。GitHubリポジトリ「asm-hall-of-shame」(Assembly Hall of Shame)を公開し、「最も遅い単一x86命令」を探すリーダーボードを立ち上げたのだ。Domasは自身のX(旧Twitter)でこう宣言している。「皆はCPUを速くしようとしている。私はCPUをダメにしようとしているのだ」。

AD

150サイクルの命令が1980億サイクルに化けるまで

現在のチャンピオンはfxrstor64だ。この命令はFPU、MMX、XMMレジスタ、MXCSRの状態をメモリ上の512バイト領域から復元する。Intelのリファレンスが示す通常のレイテンシは約150サイクル。Domasの手にかかると、同じ命令が198,002,498,236サイクル、 wall-clock時間で62秒を要した。約13億2000万倍の遅延である。

手法は3段階で構成される。

第1段階。Domasは自作ツールmmioticを使って、PCIeファブリック内部の高レイテンシMMIO(Memory-Mapped I/O)領域を特定した。MMIOとは、CPUがメモリ空間の一部として周辺デバイスのレジスタにアクセスする仕組みだ。PCIe経由のMMIO読み出しは、DRAMアクセスと比較して桁違いに遅い。Domasはこの「遅さ」を逆手に取り、fxrstor64の読み出し先をそのMMIO領域に設定した。512バイトの状態データが、最も遅いメモリアパーチャを通過する。これだけで74,584,168,512サイクル(約23.4秒)を記録した。

第2段階。fxrstor64の読み出しが進行中(in flight)の間に、別のコア群が別の高レイテンシMMIOレジスタに対して4バイト読み出しを連射する。PCIeルートコンプレックスがノンポステッドトランザクションで飽和し、fxrstor64の512バイト読み出しが無意味な読み出し操作の後ろにキューイングされる。結果、198,002,498,236サイクル(62秒)。第1段階からさらに約2.65倍の遅延を上乗せした。

条件 サイクル数 実時間 通常比
fxrstor64 通常実行(Intelリファレンス) 約150 数十ナノ秒
fxrstor64 + 高レイテンシMMIO 74,584,168,512 23.4秒 5億
fxrstor64 + MMIO + ファブリック飢餓 198,002,498,236 62秒 13.2億
(計画)xrstor64 + AMX 8KB状態領域 1,000,000,000,000超(想定) 約5分超 67億

第3段階としてDomasが視野に入れているのは、Intel Sapphire Rapids以降で利用可能なAMX(Advanced Matrix Extensions)を使ったxrstor64だ。状態領域が512バイトから8KBへ16倍に拡大するため、Domasは1兆サイクル超の達成を見込んでいる。

「遅い命令」がセキュリティを壊す

このプロジェクトを好奇心の産物として片付けられない理由は、Domasが同時に公開した別リポジトリ「smiiiiiiiiiiiiiiii」にある。

x86 CPUにはSMM(System Management Mode)という特権実行環境がある。OSやハイパーバイザーからも見えない最高権限のモードで、ファームウェアの電源管理やハードウエアエラー処理を担う。SMMのセキュリティモデルは一つの前提に立っている。あるコアがSMMに入るとき、他のすべてのコアも同時にSMMに入る(ランデブー)。SMMが実行中、外側で動いているコアは存在しない。

この前提が崩れると何が起きるか。SMMハンドラが共有メモリ上の値をチェックしてから使用する、いわゆるTOCTOU(Time-of-Check to Time-of-Use)型の脆弱性が100件以上報告されている。従来、これらは「SMM実行中にメモリを書き換えるにはDMA対応周辺機器からの物理アクセスが必要」とみなされ、実質的に悪用不能とされてきた。

Domasの実験は、この前提をソフトウエアだけで崩せることを示した。1コアを極端に長い単一命令(1秒以上)で束縛すれば、そのコアはSMMのランデブーに参加できない。SMMのタイムアウト(約1秒)が経過すると、他のコアはSMM内で実行を続ける一方、束縛されたコアは通常モードで動き続ける。SMMの「排他性」が破綻する。

DomasのPoCでは、AMD Ryzen 7 5800H上でvmovdqu命令による高レイテンシMMIO読み出しを使い、SMIカウンタの乖離(あるコアのSMIカウントが他と一致しないこと)を観測した。SMMの外で実行を続けたコアが存在したことの直接的証拠だ。

AD

逆最適化の競技ルールと計測環境

リーダーボードには明確なルールがある。スコア対象は単一命令の実行のみ。セットアップに何を使ってもよいが、計測されるのは1命令分だ。割り込み可能な命令(rep movs、pauseなど)は失格。トラップされた命令はトラップ自体の時間のみ計測し、ハンドラ内の処理時間は対象外。時間はCPUベースクロックで正規化し、ハードウエアは工場出荷状態のまま使用する。

主な計測プラットフォームはAMD Ryzen 7 5800H(Trigkey S5ミニPC内蔵)とIntel Core i7-8559U。rdmsr命令のテストにはVIA Edenチップ(2000年代初頭の組み込み向けプロセッサ)が使われた。VIAには未文書化レジスタ0x133が存在し、rdmsrが202マイクロ秒(161,602サイクル)という異常に長い応答時間を返すという。

順位 命令 戦略の要点 スコア
1 fxrstor64 MMIO + ファブリック飢餓 198,002,498,236サイクル
2 fxrstor64(ベースライン) MMIO読み出しのみ 74,584,168,512サイクル
3 vmovdqu ymm(非アライン) 仕様違反の非アライン32バイト読み出し 443,937,696サイクル
4 vmovdqu ymm 32バイトMMIO読み出し (3位以下)
5 vmovdqu xmm 16バイトMMIO読み出し (4位以下)
6 mov rax 8バイトMMIO読み出し (5位以下)
7 mov 4バイトMMIO読み出し (6位以下)

3位のvmovdqu ymm(非アライン)は興味深い。32バイト読み出しを非アラインアドレスに対して発行すると、9回の dwordレジスタアクセスに分割される。仕様上は許されない操作だが、CPUは実行してしまう。Domasはこの仕様違反の命令を、先述のSMM攻撃に直接転用している。

Domasという研究者の系譜

Domasは「実在しない問題に対する非実用的な解決策」を標榜するセキュリティ研究者だ。Battelle Memorial Institute(2009年から2018年)、Intel(2018年から2025年)を経て独立。過去の代表作には、mov命令だけで任意のCプログラムをコンパイルするmovfuscator(GitHub stars 10,190)、x86プロセッサの未文書化命令を体系的に発見するsandsifter(Black Hat 2017で発表)、x86 CPUのハードウエアバックドアを暴露したrosenbridge(Black Hat 2018)がある。

sandsifterは「命令セットを壊す」というアプローチで、プロセッサが公式に認めていない命令を数百万単位で発見した。今回のAssembly Hall of Shameは、同じ「ISAの境界を探る」という動機を、速度軸の逆方向に適用したものだ。

AD

未検証の条件と残された問い

リーダーボードにはARM版とRISC-V版が「T.B.D.」として予定されている。アーキテクチャが異なればMMIOの順序付けルールも異なり、上位の戦略がそのまま通用するかどうかは不明だ。Hacker News上の議論では「MMIOを使うのはズルで、結果がつまらない。メインメモリだけで競うべきでは」という意見もあるが、DomasのルールはMMIOを禁止していない。

もう一つの未解決問題は、この遅延に上限があるかどうかだ。PCIeバスを任意の時間ストールできるなら、fxrstor64の遅延に原理的な上限は存在しない可能性がある。Domas自身もGitHubのREADMEで、AMXによる8KB状態領域への拡張を「次なる標的」として挙げているが、これはSapphire Rapids以降のCPUが手元にないと検証できない。

SMM攻撃のほうも、PoCは1台のZen 3マシンに調整済みである。DomasはREADMEで「あなたのプラットフォームでは、高レイテンシMMIOアドレスをmmioticで探し直し、命令幅をxmm、ymm、zmmと段階的に広げてランデブータイムアウトを超えるまで調整する必要がある」と書いている。汎用的な悪用にはプラットフォームごとのチューニングが要る。

それでも、この研究が突きつけた事実は重い。CPUの設計者たちが「1命令は数サイクルで終わる」と暗黙に仮定してきた場所に、62秒間動かない命令が存在する。その仮定の上に築かれたセキュリティモデルが、1行のアセンブリで崩れてしまうのだから。