ファイバーとユーザーレベルスレッド
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 はワーカー本体のための別のインタープリターを実装しません。
関連するしくみ
これらのページについて