本文へスキップ
PS5PCEM
一部ファームウェアと HLE

ファイバーとユーザーレベルスレッド

Windows では libSceFiber のファイバーがそれぞれ本物の Windows のファイバーなので、切り替えでゲストのレジスターとゲストのスタックが保たれます。ユーザーレベルスレッドは同じ pthread の経路で始まります。

2026年10月10日 までのリポジトリノート

ファイバーを何もしない処理にできない理由

ゲストのコードはネイティブの機械語として動きます。ファイバーの切り替えでは、ホストとゲストのフレームが混在するスタック上で、まったく同じレジスターとまったく同じスタックから再開しなければなりません。切り替えずに sceFiberSwitch から成功を返すと、タイトルは間違ったスタックで続行し、双方を壊してしまいます。

PS5PCEM は初期化されたゲストのファイバーをそれぞれひとつの Windows のファイバーで支えます。sceFiberRun、sceFiberSwitch、sceFiberReturnToThread はこの仕組みを使います。sceFiberRun を呼んだスレッドがルートのファイバーです。公開されている 128 バイトの SceFiber レコードは、ABI のシグネチャ、状態、エントリーの引数、名前、呼び出し側が用意したコンテキストの範囲を保持します。

スタックは誰のものか

タイトルはコンテキストのバッファを用意し、そのバッファは ABI のオブジェクトに記録されます。実際のスタックを所有するのは Windows です。タイトルのバッファをネイティブの Windows のスタックとして使うと、オペレーティングシステムが必要とするガードページと巻き戻しの管理を飛ばしてしまいます。それでも、ファームウェアのレコードが期待する最小のコンテキストは、アラインメントと先頭・末尾のシグネチャとともに確認します。

sceFiberGetSelf、終了処理、スレッドをまたぐ所有権のチェック、ランタイムのリセットは実装済みです。このバックエンドは Windows x86-64 のネイティブ実行のターゲットにあります。ほかのホストでもエミュレーターの残りの部分はビルドできますが、この切り替えの経路はそこでは使えません。

ユーザーレベルスレッド

libSceUlt の初期化と終了は成功するため、タイトルのジョブシステムが起動できます。ランタイム、待機キュー、キューデータのプール、ミューテックス、セマフォ、キューは、タイトルが割り当てたオブジェクトをキーにしてホスト側の状態を保持します。作業項目そのものは既存の pthread の経路で始まります。作業領域のサイズの問い合わせは、それらの作成処理が期待するアラインされたサイズを返します。

カーネルのユーザーエッジのイベントキューは、pthread の同期と同じシーケンスを考慮した待機を共有します。VideoOut のフィルター -13 とグラフィックスのフィルター -14 はこのキューを使い、各登録の識別子とユーザーデータを保ちます。ULT はスケジューリングをつなぐ部品です。2 つ目の CPU エミュレーターを追加するものではありません。

実装済みのこと

  • sceFiberRun、sceFiberSwitch、sceFiberReturnToThread のための Windows のファイバー。
  • ABI のシグネチャ、所有権のチェック、ガードページ付きのホストが所有するスタック。
  • ULT の初期化、キュー、ミューテックス、セマフォ、pthread を使う作業項目。
  • VideoOut とグラフィックスの完了と共有するユーザーエッジのイベントキュー。

まだ足りないこと

  • ファイバーの切り替えは Windows x86-64 にあります。ほかのホストのオペレーティングシステムはゲストのコードをネイティブに実行しません。
  • ファイバーは、プリエンプティブにスケジュールされるハードウェアスレッドではありません。
  • ULT はワーカー本体のための別のインタープリターを実装しません。

関連するしくみ

これらのページについて

本文は PS5PCEM リポジトリのアーキテクチャノートと 2026 年 10 月のレポートに基づいています。個別のテストに合格したことは、新しいフレームレートや新しいクリアを意味しません。

すべての技術