Zum Inhalt springen
PS5PCEM
TeilweiseFirmware und HLE

Fibers und User-Level-Threads

Unter Windows ist jeder Fiber von libSceFiber ein echter Windows-Fiber, sodass ein Wechsel die Gastregister und den Gast-Stack behält. User-Level-Threads starten über denselben pthread-Pfad.

Repository-Notizen bis 10. Oktober 2026

Warum ein Fiber keine Leeroperation sein darf

Gastcode läuft als nativer Maschinencode. Ein Fiber-Wechsel muss genau die Register und genau den Stack wieder aufnehmen, wobei Host-Frames und Gast-Frames auf diesem Stack gemischt sind. Erfolg von sceFiberSwitch zurückzugeben, ohne zu wechseln, ließe den Titel auf dem falschen Stack weiterlaufen und beide Seiten beschädigen.

PS5PCEM hinterlegt jeden initialisierten Gast-Fiber mit einem Windows-Fiber. sceFiberRun, sceFiberSwitch und sceFiberReturnToThread nutzen diesen Mechanismus. Der Thread, der sceFiberRun aufgerufen hat, ist der Wurzel-Fiber. Der öffentliche SceFiber-Datensatz von 128 Byte behält die ABI-Signaturen, den Zustand, das Eintrittsargument, den Namen und den vom Aufrufer bereitgestellten Kontextbereich.

Wem der Stack gehört

Der Titel liefert einen Kontextpuffer, und dieser Puffer wird im ABI-Objekt festgehalten. Windows besitzt den tatsächlichen Stack. Den Puffer des Titels als nativen Windows-Stack zu nutzen würde die Schutzseite und die Unwind-Buchführung überspringen, die das Betriebssystem verlangt. Der Mindestkontext, den der Firmware-Datensatz erwartet, wird weiterhin geprüft, zusammen mit der Ausrichtung und den Signaturen von Anfang und Ende.

sceFiberGetSelf, das Abschließen, threadübergreifende Besitzprüfungen und das Zurücksetzen zur Laufzeit sind implementiert. Das Backend gibt es auf dem Ziel für native Ausführung unter Windows x86-64. Andere Hosts können den Rest des Emulators bauen, und dieser Wechselpfad steht dort nicht zur Verfügung.

User-Level-Threads

Initialisieren und Abschließen von libSceUlt gelingen, damit das Job-System eines Titels starten kann. Laufzeiten, Wartewarteschlangen, Pools für Warteschlangendaten, Mutexe, Semaphoren und Warteschlangen halten Zustand auf der Host-Seite, geschlüsselt nach den Objekten, die der Titel zugeteilt hat. Die Arbeitseinträge selbst starten über den vorhandenen pthread-Pfad. Abfragen der Arbeitsbereichsgröße liefern die ausgerichteten Größen, die diese Erzeugungen erwarten.

User-Edge-Ereigniswarteschlangen des Kernels teilen dasselbe sequenzbewusste Warten wie die pthread-Synchronisation. Der VideoOut-Filter -13 und der Grafikfilter -14 liegen auf dieser Warteschlange und behalten die Kennung und die Nutzerdaten jeder Registrierung. ULT ist der Leim der Ablaufplanung. Es fügt keinen zweiten CPU-Emulator hinzu.

Was umgesetzt ist

  • Windows-Fibers für sceFiberRun, sceFiberSwitch und sceFiberReturnToThread.
  • ABI-Signaturen, Besitzprüfungen und ein Stack im Besitz des Hosts mit einer Schutzseite.
  • Initialisieren von ULT, Warteschlangen, Mutexe, Semaphoren und über pthread hinterlegte Arbeitseinträge.
  • User-Edge-Ereigniswarteschlangen, gemeinsam mit dem Abschluss von VideoOut und Grafik.

Was noch fehlt

  • Den Fiber-Wechsel gibt es unter Windows x86-64. Andere Betriebssysteme des Hosts führen Gastcode nicht nativ aus.
  • Ein Fiber ist kein präemptiv geplanter Hardware-Thread.
  • ULT implementiert keinen eigenen Interpreter für die Rümpfe der Worker.

Verwandte Mechanismen

Worum es auf diesen Seiten geht

Der Text folgt den Architektur-Notizen und den Berichten vom Oktober 2026 im PS5PCEM-Repository. Ein bestandener Einzeltest ist keine neue Bildrate und kein neuer Durchspielstand.

Alle Techniken