HLE(ファームウェアの高レベルエミュレーション)
HLE は、タイトルがインポートするファームウェア呼び出しに PS5PCEM が応える仕組みです。数値の NID はそれぞれホストのスタック上で動く Zig の関数になり、Windows でもゲストの System V 呼び出し規約が保たれます。
2026年10月10日 までのリポジトリノート
なぜファームウェアはゲームに含まれないのか
PlayStation 5 のタイトルは、呼び出すオペレーティングシステムを自分では持っていません。インポートは 11 文字の識別子です。PS5PCEM は各識別子をエクスポート名から計算します。名前と固定のソルトの SHA-1 を取り、ダイジェストの先頭 8 バイトを base64 の変種で表したものです。実装は読める名前で登録され、その名前が生むはずの識別子を必須にできるため、エクスポート名の綴りを間違えるとモジュールのビルド時に失敗します。
動的リンカーは、識別子をライブラリ、モジュール、それらのバージョンと組み合わせて検索します。同じ識別子が複数のライブラリに存在することがあります。使えるメタデータを持たないインポート向けに識別子だけでの検索もありますが、あいまいなため、このフォールバックは最後の手段として扱います。
呼び出しはホストのスタックで動く
ゲストはファームウェアを直接呼ぶため、呼び出しはゲストスレッドのスタック上で始まります。タイトルがそう要求するので、このスタックは 1 MB であることが多いのです。ファイルを開くようなホストの処理には、はるかに大きなフレームが必要です。コンパイラーはそのフレームを、早期リターンより前の入口で確保します。そのため、ファームウェアの本体は領域が必要な行に到達する前にゲストのスタックからはみ出し、フォールトはどのゲストのマッピングの外でも起こりえます。
すべての HLE 呼び出しは、ホストの処理の間、スレッドごとのホストスタックに切り替わります。引数はメモリを経由して渡るため、浮動小数点や集成体の戻り値を含め、ひとつのアセンブリのスタブがすべてのシグネチャを扱えます。入れ子になったファームウェア呼び出しは、外側の呼び出しがすでに用意したスタックに留まります。Windows ではゲストが System V AMD64 規約、ホストが Microsoft x64 を使うため、ゲストから呼べる関数はすべてゲストの規約で宣言します。この宣言を付け忘れてもコンパイルは通りますが、引数を間違ったレジスターから読んでしまいます。
HLE がカバーする範囲
この仕組みの上で、ファームウェアのライブラリが、ダイレクトメモリとフレキシブルメモリ、モジュールのハンドル、pthread、同期、ファイル、セーブデータ、ファイバー、フォント、PNG、時計、パッド、AudioOut、AJM、NGS2、ACM、AvPlayer、APR、AMPR を提供します。ネットワーク、SSL、NP Web API はコンテキストとリクエストの寿命を保ち、決定的なオフラインのエラーを返します。システムシェルが必要なダイアログは、整合したヘッドレスの結果ですぐに終了します。
10 月 10 日の検証実行では、ReleaseSafe の HLE スイート全体、606 件中 606 件に合格しました。この数はファームウェアのスイートのものです。それだけで新しいフレームレートや新たなクリアを記録したことにはなりません。
実装済みのこと
- NID の計算、バージョン付きのシンボル登録、すべてのファームウェア呼び出しでのホストスタックへの切り替え。
- ホストの規約が Microsoft x64 である Windows での、ゲストの System V 呼び出し。
- メモリ、ファイル、スレッド、セーブデータ、メディア、オーディオコーデック、APR/AMPR のコマンドパス。
- ヘッドレスのダイアログと、ホストのソケットを開かないオフラインのネットワークプロファイル。
まだ足りないこと
- タイトルがインポートし、PS5PCEM が実装していないライブラリは、依然としてインポートに失敗します。
- 公開されたグラフになかったモジュールを本当にオンデマンドで読み込もうとするとエラーを返します。
- 本物のシェル、アカウント、ネットワーク上の相手が必要なプラットフォームサービスは使えないままです。
関連するしくみ
これらのページについて