Zum Inhalt springen
PS5PCEM
FunktioniertCPU, Lader und Werkzeuge

Native Gastausführung

Unter Windows x86-64 läuft der Maschinencode des Gastes direkt. Ein Host-Worker trägt jeden Gast-pthread, und die FS-Basis wird nach jedem blockierenden Aufruf wiederhergestellt, weil Windows sie nicht behält.

Repository-Notizen bis 10. Oktober 2026

Ein Worker je Gast-Thread

Der Verteiler startet einen Host-Worker für jeden Gast-pthread, richtet das TLS dieses Threads ein und betritt den Gast an der verlangten Adresse mit den Argumentregistern von System V. Join, Detach, Yield, Sleep, verschachtelte Rückrufe und scePthreadExit kommen alle über diesen Pfad zurück. Der HLE-Thread wird erst abgeschlossen, nachdem die Gastausführung diesen Kontext verlassen hat.

Die Brücke prüft, dass der Eintrittspunkt ausführbar ist und dass Stack und TLS abgebildet sind. Sie sichert die nonvolatilen Register von Windows, MXCSR und das x87-Steuerwort, wechselt auf den Gast-Stack, setzt die FS-Basis des Gastes und ruft den Eintritt auf. Ein synchrones scePthreadExit verlässt über einen nativen Ausstieg, der die Gast-Stackframes verwirft und die FS des Hosts wiederherstellt, bevor der Verteiler die Unterbrechung sieht.

Windows verwirft die FS-Basis

FS einmal zu setzen reicht nicht. Windows erhält eine vom Nutzer geschriebene FS-Basis über einen Kontextwechsel hinweg nicht. Nach einem Sleep liest rdfsbase wieder null. Gastcode hält seinen threadlokalen Speicher in FS, nach der Konvention System V, sodass der nächste Zugriff relativ zu FS nahe Adresse null fehlschlagen würde. Am Gast ist nichts falsch. Der Host hat ein Register verworfen, auf das sich der Gast verlassen darf.

Der Verteiler stellt FS deshalb nach blockierenden Aufrufen wieder her. Wartebedingungen nutzen einen sequenzbewussten Futex, sodass ein Aufwachen, das zwischen einem Freigeben und dem Parken eintrifft, genau einmal verbraucht wird, und ein Broadcast für jeden Wartenden sichtbar bleibt, der die ältere Sequenz beobachtet hat. Wenn die feste Wake-Historie jemals gesättigt ist, weckt der Verteiler mehr als nötig und lässt HLE das Objekt erneut prüfen. Zeitbegrenzte Schlafvorgänge nutzen eine private, nicht alarmierbare Verzögerung, damit ein unabhängiges Aufwachen einen Audio-Worker nicht in eine Dauerschleife versetzt.

Fehler und andere Betriebssysteme

Ein fehlerhafter Gast-Thread wird eingedämmt. Die Diagnose ordnet die Adresse einem Modul und einem Symbol zu, wenn sie es kann, und der Prozess muss nicht an einer unbehandelten Ausnahme des Hosts sterben. PS5_CPU_WAIT_DIAGNOSTICS=1 schaltet die ausführliche Warte-Ablaufverfolgung wieder ein. Sie ist beim gewöhnlichen Spiel aus, weil mehrere geparkte Worker, die gleichzeitig ausgeben, selbst ein Bild aufhalten können.

Native Ausführung verlangt Windows x86-64 und das Prozessormerkmal RDWRFSGSBASE. Builds für Linux und macOS kompilieren weiterhin den Decoder, den Lader und HLE und melden die native Brücke als nicht unterstützt. Gastbinärdateien sind Maschinencode für x86-64. Sie werden nicht interpretiert.

Was umgesetzt ist

  • Native Gastausführung für x86-64 unter Windows, ein Host-Worker je Gast-pthread.
  • Aufrufe nach System V, Gast-Stacks und FS, wiederhergestellt nach blockierenden Aufrufen.
  • Sequenzbewusste Wartebedingungen, eingedämmte Fehler und ein pthread-Ausstieg, der den Host wiederherstellt.
  • Untersuchung, Dekodierung und HLE unter Linux und macOS, ohne native Ausführung.

Was noch fehlt

  • Es gibt keinen Interpreter. Andere Hosts als Windows x86-64 führen den Gast nicht aus.
  • Eine CPU, die die Basen von FS und GS nicht schreiben kann, kann die native Brücke nicht betreten.
  • Ausführliche Wartediagnose ist standardmäßig aus, weil ihre Ausgaben das Spiel aufhalten.

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