 Viel Spaß. Also, ich werde mal Martin vorstellen. Er war schon mal hier. Er hat schon mit der Wii rumgespielt. Er hat schon die PS3 gehackt. Und er hat schon ... Und dann ... Er hat gerade noch gesagt, dass man die Titel unsere Übersetzung auf 8.011 bekommt. Ja. Und letztes Jahr hatte er eben die PlayStation vorgehackt. Und jetzt wird er darüber wieder reden. Er hat noch seinen Computer noch nicht eingemacht. Weil ... Sein Computer ist ein bisschen speziell. Er hat viel OpenSoftware drauf. Sein Computer hat einen FreeBSD Operating System. Es ist guter als die PlayStation 4, die er gehackt hat. Also, es hat auch OpenSSL da drin. Und EngineX und Cairo. Da laufen sehr viele interessante OpenSoftware-Programme drauf. Aber wir können ihm sogar noch interessanter Sachen machen lassen und darüber eine Präsentation halten. Also, geben wir mal eine Präsentation von der PlayStation 4. Das ist ein guter Start, ein schwarzer Bildschirm. Vielleicht. Also, jetzt ist es gerade, dass das ganze Fire System fährt herunter. Und jetzt lädt ... Und ja, ich benutze Gento Linux. Ja, das ist jetzt sehr ... Funktioniert das WLAN-Moment. Ja, funktioniert. Okay, nein, TP hat nicht funktioniert. Nervig, aber nicht das Schlimmste, was passieren kann. Es dauert eine Weile, bis es booted ist. Es benutzt nicht SystemD. Es ist ein bisschen langsamer. Und here we go. Da sind wir. Und jetzt funktioniert der Controller. Bluetooth, ja, funktioniert. Okay, wunderbar. Also, fangen wir an. Also, das hier ist Console Hacking 20.2.2016. PlayStation 4 PC Masterics. Und er entschuldigt sich für den schlimmen Nazi-Joke in dem Überschiff. Ist die PlayStation 4 jetzt ein PC? Ist es nicht ein PC? Aber bevor wir anfangen, er würde gerne diesen Talk seinen guten Freund widmen. Er ist leider gestorben. Er heißt Ben. Er war ein Superhacker. Er kam zu vielen Kongressen, der nettesten Leute, der ihn hier getroffen hat. Und wenn er nicht gewesen wäre, dann wäre der Speaker nicht hier. Danke. Also, linken wir los. PlayStation 4. Ist es ein PC? Ist es nicht ein PC? Also, es ist ein bisschen anders als vorherige Console. Es hat X86. Es hat WebKit. Es hat kein Hypervisor. Unglücklicherweise. Die PlayStation 3 hatte Hypervisor, aber es war unnützlich. Es ist anders als die PlayStation 3, aber es ist nicht anders. Es hat einen sicheren Prozessor, aber das kann zu einem Freikinodieren. Also, es ist nicht so wichtig. Wie macht man den PlayStation 4 fertig? Du lässt ein Work gelaufen und du lässt ein FreeBSD laufen und dann ist es fertig. Also, das ist langweilig. Wie gesagt, mit WebKit und FreeBSD ist es etwas anders. Also, dieser Talk, ich werde aber etwas anders reden. Da gibt es noch einen dritten Schritt, und das wissen wir nicht, was es ist, sondern man gibt einen vierten Schritt und dann wird es aus, wird es wunderbar. Also, bevor man ein Exploit benutzt, muss man ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... Und dann gibt es die Liverpool-APU, das ist der Hauptprozessor. Und der wird von AMD gebaut, der hat ein bisschen Ram, und die Southbridge verbindet sich zu ein paar Dingen, wie das Bluetooth und so weiter. Und die interne Festplatte ist tatsächlich USB, also SATA nach USB nach SATA, obwohl es einen SATA-Anschluss hat. Warum? Okay, also wie greifen wir dieses Ding hier an? Was ist gerade passiert? Oh, ich habe scheinbar einen Bildschirm schon hat, das ist ja auch super. Ich dachte, das hätte ich ausgeschaltet. Na gut, dann lasst mal eben Xtreme selber killen. Irgendwas musste ja schiefgehen, irgendwas geht immer schief. Ich kann natürlich mich per SSH in meine PS4 verbinden. Na gut, also ich wollte das eben nur gerade reparieren. Okay, also welche dieser Interfaces greifen wir jetzt an? USB, SATA, das ist... Also das sind alles CPU-kontrollierte Interfaces. Die Geräte können nicht wirklich irgendwas tun. Also man kann nicht direkt in Speicher schraben. Man kann USB angreifen, wenn man den USB Treiber angreift, aber dann haben wir wieder das Problem, dass wir den Code nicht haben, also okay. Also der i wäre super, aber das ist ein sehr schneller Boss. Das ist zwar sehr angreifbar wahrscheinlich. Also geht mal davon aus, dass wir DDR5 auch noch exploiten. Das werden wir sicher machen. Aber es gibt auch was, das heißt PCI Express. Und das ist tatsächlich ganz interessant. Denn das ist super lustig für Sacking, weil es geht zwar... Also es geht um ein Boss, das heißt, man kann direkt auf Speicher zugreifen. Es ist robust. Man denkt irgendwie, das hat irgendwie Wudu, um die schnelle Geschwindigkeit. Man braucht da keine besonders großartige Konfiguration. Man kann das kurz schließen und dann funktioniert das irgendwie. Es hat kein Problem mit Verzögerungen. Also man kann sich Zeit lassen. Keiner schreibt Treiber für PCI Express unter der Annahme, dass das Gerät bösartig ist. Das sollten alle machen, aber das macht niemand in Wirklichkeit. Also was machen wir? Wir haben den PCI Link und jetzt schneiden wir das durch und schieben hier ein Gerät dazwischen. Das heißt, die South Bridge ist jetzt eine Karte für uns. Das verbindet jetzt sich zu einem FPGA-Ball. Das heißt, es kann so tun, als wäre es ein PCI Express Gerät. Und wir benutzen PCI Express einfach nur mit Geschwindigkeit mal eins, weil es leichter ist. Aber das kann man einfach aushalten. Also wer von euch hat schon mal Hardware-Hacking gemacht? Hebt mal die Hände. Ich denke, es ist vielleicht ein Drittel oder fast die Hälfte. Also wenn man mit der Hardware redet und da fängt eine LED an zu blinken, was das erste Ding über welches Gerät man reden kann, naja, über eine serielische Stelle. Das heißt, man kann PCI Express einfach seriell ansprechen. Das ist dann super, super langsam, 0,0002. Und jetzt gehen wir auf eine höhere Geschwindigkeit. Also wir kriegen die andere Richtung Gigabit-Differnet. Das ist dann 0,5-fach PCI Express. Aber es funktioniert. Das ist total lustig, aber es funktioniert wirklich. Also man kann das sogar noch ASCII-Enquoden und dann hat man natürlich nur noch die halbe Bandbreite. Aber man kann PCI Express, also es ist ein verlässliches Package-Switch-Netzwerk, also ein Paketgeschwitch-Netzwerk. Man kann darüber Speicher lesen, Interfaces lesen und schreiben, Konfiguration lesen und schreiben. Man kann sagen, hier, ich schreibe jetzt, also teilen wir mal was mit, in dem du auf eine Adresse im Speicher schreibst. Das hat alte Interrupts, die man benutzen kann. Man kann das alles über PCI Express tunnen. Man kann Completions benutzen, das ist so eine Art Antworten. Also man kriegt dann den Wert, den man lesen wollte, kriegt man zurück über einen Speicherzugriff. Und jetzt hat direkt ein Speicherzugriff. Das heißt, wir können einfach den gesamten Speicher auslesen. Aber leider funktioniert es nicht, denn das hat eine IOMMU. Das heißt, der merkt sich welcher Speicherbereich deinem Gerät zugehört. Das heißt, das muss dazu, zu dem Gerät gehören. Aber bloß, weil das ein IOMMU besitzt, heißt es nicht, dass Sony das auch korrekt benutzt. Und hier ist so eine Implementierung. Und man kann hier einfach sagen, hier gibt mir mal diesen Buffer mit dieser Länge. Sieht ihr man den Fehler? Naja, map das raus und dann schickt das zurück. Aber mapen bedeutet halt mal in Pages. Das heißt, man kriegt einfach ein Stück vom Stack mit zurück. Und das bedeutet, man kriegt den Stack, kriegt dann also den Stack übernehmen. Und daraus kriegt man Codausführung. Und das kann man dann benutzen, um den Kernel zu danken und neu zu flächen. Wir wollen jetzt aber einen ordentlichen Explore machen. Also wie gesagt, man kann Webkit, FreeBSD, wie auch immer. Also wie geht es weiter? Wir wollen am Ende Linux ausführen, klar. Aber wie kommt man jetzt von FreeBSD zu Linux? Und es ist nicht trivial. Wir benutzen was, das heißt PS4KXX. Also ganz einfach, du willst Linux ausführen, also springe halt einfach zu Linux. Naja, aber wir müssen eine ganze Menge Parameter aufsetzen, FreeBSD runterfahren, Pagetables aufsetzen und so weiter. Ihr könnt euch den Code anschauen. Ich werde euch damit nicht langwahlen. Aber es gibt eine ganze Menge Sachen, die man da machen muss. Und jetzt behaupten wir einfach mal, wir machen das. Ihr könnt das. Ihr habt das alles aufgeräumt und startet springt zu Linux. Und jetzt ist alles super, oder? Nein. Also es wird wahrscheinlich laufen, eine Weile zumindest. Und dann hört es auf. Und es gibt keine Serialesinterface, keine Videoausgabe usw. Und da müssen wir jetzt leider kurz über Hardware sprechen. Was ist X86? X86 ist so eine mittelmäßig gute Anweisungsarchitektur von Intel. Und die PS4 ist definitiv X86. Jetzt müssen wir die Frage stellen, was ist ein PC? Ein PC ist eine schreckliche, schreckliche Sache, die auf Bergen und Bergen von uraltem Zeug, das in den 80ern erfunden wurde. Und in dem Sinne ist die PS4 eben kein PC. Also es könnte einer sein, aber es ist nicht. Also was ist ein PC, ein alter PC? Das ist 80, 59 Interrupt Controller. Das ist ein Standard Dressboard. UALT hat PS2-Tastatur-Controller, hat eine Echtzeit-Uhr-Chip und ein ISA-Bus. Also selbst wenn ihr denkt, ISA, das hat meine Rechnung natürlich noch nicht mehr. Aber tatsächlich hat er das intern immer noch. Und die PS4 hat das alles nicht. Also was machen wir? Und jetzt gucken wir uns kurz an, wie eine PS4 arbeitet. Also hier in der Mitte, da haben wir dann irgendwie eine AMD-CPU oder eine Intel Core-CPU. Und da geht es ran. Es sieht irgendwie so ein bisschen aus wie das Schema von vorhin. Also man könnte es irgendwie in Verbindung bringen. Was ist jetzt also schon schwierig daran? Und ich habe es vorhin schon gesagt, naja, PC hat eine Southbridge, richtig? Ja, nein. Und AMD implementiert den alten Intel Standard von 1981. Und Marvel Ayola implementiert den alten Intel von 2002. Was bedeutet das jetzt? Das ist also in Wirklichkeit keine Southbridge. Das ist ein Marvel Armada System und Chip. Das heißt, es war nie wirklich eine Southbridge. Es ist eine System und Chip CPU, die komplett eigenständig ist. Und die hat ein paar Geräte, die sie ansprechen kann. Und auf der einen Seite tut es eben so. Und sagt dem der CPU, hier, du kannst jetzt alle meine Chips benutzen. Das heißt, es hat auch seinen eigenen Ramm und so weiter. Und warum? Na ja, denn das führt tatsächlich auch FreeBSD aus. Und so funktioniert es, dass die auch sagen hier, ihr könnt Updates im Hintergrund runterladen. Wenn es gibt ein zusätzliches Betriebssystem, dass dann die Updates im Hintergrund runterlädt und so weiter. Das klingt ganz cool, aber es ist tatsächlich alles ganz schrecklich. Also, so sieht eine PCI-Bus-Nummer aus. Es hat eine Bus-Nummer, 8-Bits, eine Geräte-Nummer, 5-Bits und eine Funktionsnummer, 3-Bits. Das habt ihr, wenn ihr LSPCI mal ausgeführt habt, sicher alles schon mal gesehen. So sieht also eine normale Southbridge aus. Hat ein ISA-Bridge, PCI-Bridge und so weiter. Und eine Southbridge besteht also aus möglicherweise verschiedenen Geräten. So, wir haben nur 3-Bits für die Funktionsnummer, also kann es nur 8 Funktionen in einem Gerät geben. Was machen wir also? Wir nehmen also verschiedene Geräte und dann kann man da eben direkt mit allen reden. Und wenn man jetzt LSPCI auf dem Marvel-Iola ausführt, dann sieht es irgendwie so aus. Und das funktioniert so, wenn das PCI-Query normalerweise, wenn das PCI-Query meinem Werner-Divis-Nummer entspricht, dann antwortet uns uns nicht. Und die Idee ist einfach, na, ich antworte jetzt auf jeden einzelnen Query. Und hat dann zusätzlich noch 8 Funktionen, also ACPI und so weiter. Und 8 Funktionen sind aber leider nicht für alle genug. Und die PCI Express Glue, Funktion Nummer 4, die hat dann ganz viele unterschiedliche Unterfunktionen, die alle in einem PCI-Divis erbracht werden. Und Linux hat eine minimale Anforderung an die Hardware. Also es braucht Timer, es braucht Interrupts und es braucht eine Art Konsole. Und DS4 hat all das nicht. Also insbesondere keine PIT, keine PIC und keine normale serielle Konsole. Und jetzt wollen wir den, die Message ausführen, also den Colonel Ringbuffer, auslesen. Und es gibt eine Möglichkeit, Linux zu sagen, benutzt mal den UR8250 als Ausgabe und schreibt es da rein. Und das funktioniert erstmal nicht. Dafür muss man dann die Clock noch mal ändern, also 3200, heißt dann benutze den Geschwindigkeit 115200. Und jetzt brauchen wir noch ein Timer, sonst funktioniert gar nichts. Und dafür unterstützt Linux den TSC, der ist eingebaut, der ist total großartig. Und Linux versucht den aber zu kalibrieren gegen den Legacy Timer, den hat aber die PS4 nicht, also es funktioniert nicht. Und das bedeutet also nochmal, die PS4 ist wirklich kein PC. Und man benutzt also den bootloader und sagt, hier, das ist also kein PC, das ist eine PS4. Ich mache also die Kalibrierung mit einem speziellen Code, der gegen diesen PS4 Timer kalibriert. Und jetzt ist es also ganz offiziell auch kein PC mehr. Und jetzt müssen wir noch mal über ACP reden. Und ihr kennt es wahrscheinlich von, weil es bösartig und schlecht ist und das hat auch mit Microsoft zu tun. Und klar, es geht auch darum, wie man das System in Standby schickt und in Schlafmodus. Aber es geht nicht nur um Stromzustände, sondern es macht auch sehr viel mehr. Und wir müssen das alles reparieren für PS4, KXX. Okay, jetzt haben wir also Timer, jetzt haben wir eine serielle Interface. Und jetzt möchte ich dem Gerät sagen, ich brauche jetzt Interrupt. Und jetzt ist die Idee, dass der CPU Interrupt Controller einen bestimmten Schreibtzugriff sieht und darauf dann sofort reagiert und dann direkt den Interrupt auswirkt. Und wie das funktioniert ist, naja, dieses Gerät reagiert, sagt dann direkt der CPU, du musst jetzt diesen Interrupt auswirken. Und der IOLA, der ignoriert diese Standardregister und hat stattdessen einen eigenen MSI-Controller, der in dieser Funktion 4, die wir vorher schon hatten, dieses Clue-Device. Und jede Funktion kriegt eine gemeinsame Funktion und über verschiedene 5-Bits wird dann noch zusätzlich noch eine Subfunktion aufgerufen. Und das bedeutet, dieses Device löst ein Interrupt aus und das löst dann im anderen Device ein Interrupt aus und das löst dann den eigentlichen Interrupt in dem letzten Device aus. Und was bedeutet das jetzt? Jetzt haben wir auch noch abhängige Geräte und Interrupt sind auch noch nicht einfach aufsteigend nummeriert. Also viel wird auch einfach nicht funktionieren und das ist super anstrengend dafür zu entwickeln. Und es gibt jetzt noch einen zentralen Treiber, der dieses IACU-Interface implementiert und wir müssen einige Treiber patchen, um diese Interrupt zu benutzen und andere, die leider wegen diesen oberen Bits, die wir gerade hatten, sind die alle irgendwie in einer Funktion und wir können das Gott sei Dank reparieren über die IAMMU. Also das ist super, weil dann die Funktionen einfach aufsteigend nummeriert sind. Aber wir müssen dafür das ACPI-Tabelle für die IOMMU reparieren. Das funktioniert, aber dann können wir die einzelnen Funktionen ansprechen. Also schauen wir die Checkliste, wir haben jetzt Interrupts, Timers, wir haben Serialization-Stands für User Space, aber wir haben immer noch keine. Manchmal hängt sich die Konsole dann aus. Okay, was gibt es hier los? Also es stellt sich raus, dass FreeBSD, wir müssen das auch aufräumen. Okay, diese Fixeserie, das hat jetzt ewig gedauert, um das zu finden. Ich muss die ganze Zeit Register dampen und dann schauen, was es ist, da als FFF, da als nicht FFF, was ist da los? Und dann muss ich durch diesen Stack backtracken, bis ich das gefunden habe, das war sehr, sehr nervös. Also wir haben jetzt alles, was wir brauchen. Wir haben diese Plattform, auf die wir uns ran können. Wir haben das USB XIGI, was drei Controller in einer Funktion sind. Wir haben SDHCI, Ethernet, wir müssen noch Ethernet machen, was noch mehr Hex braucht. Und das ist immer noch ein bisschen kaputt. Und das hat alles wunderbar funktioniert auf Linux 4.4 und dann habe ich vor drei Tagen versucht, auf Linux 4.9 das alles zu laufen. Und dann ist alles wieder kaputt gegangen und DME ist auch kaputt gegangen und wir haben einfach ihre Hände aufgeworfen. Was zum Teufel ist los? Also so sieht die Aeolia normal aus. Es ist ein Arm-Socket. Es ist ein eigenes, kleines System. Es ist mapped 2 GB RAM auf die Register. Und die EC kann mit der Register umstehen. Es hat sein eigenes RAM und seinen eigenen Adressraum. Aber jetzt haben wir in der Mitte ein IOMMU, was wir da für die Interesse brauchen. Und diese IOMMU tut seinen eigenen Adress-Face in die Aeolia und dann sagt es, okay, du kannst machen. Diese Adresse geht zu dieser Adresse. Aber Linux 4.4 hat das gemacht. Also es hat ein paar Rests dann unten in der IOMMU gefunden und es hat gesagt, du kannst jetzt zu diesen Pages mapen. Und dann geht das zu dem X86 rüber. Und das funktioniert. Aber jetzt zwischen 4.4 und 4.9 macht es jetzt das. Jetzt map das Pages vom oben auf dem IOMMU-Raum. Und das funktioniert wunderbar für die IOMMU. Aber das funktioniert nicht für IOMMU, sondern für IOMMU. Es ist mapped jetzt so, es mapped jetzt nicht mehr auf dem RAM von der PC, sondern auf dem RAM von IOMMU. Und das wird nicht funktionieren. Also die IOMMU implementiert 31-bit DMA, und nicht 32-bit DMA. Und was soll das? Wieso ist das? Das ist einfach nur dumm. Und das Problem ist, es ist überall verteilt im Code in der Regelung. Es funktioniert aber, es ist sehr schlimm. Okay, jetzt haben wir alle die Geräte zu funktionieren können. So, jetzt überhaupt was komplett anderes. Wer ist dieser Charakter? Das ist Starsha. Und das ist scheinbar der Code Name für den Grafikchip von der PS4. Aber naja, das ist eine von den Code Namen, weil scheinbar sind sie nicht darüber einig, wie der Code Name. Also Starsha ist es in einer, an einem Platz. Und dann ist es JBJ. Und dann ist es Liverpool. Und damit wir uns nicht verwirren. Also, was ist diese Grafikkarte? Also es ist eine RMDCI, die GCN Generation. Es ist ähnlich zu anderen Chips aus der gleichen Generation. Also es ist nicht irgendwas komplett spinnendes Neues. Aber es hat komische Sachen. Also wir haben Bonner benutzt. Und das ist auch eine von den anderen Chips. Wo der Verlinung schon implementiert ist. Und dann haben wir gesagt, mach einfach das, was du Bonner machst, aber dann endest ein bisschen ab. Also, wie hacken wir jetzt die Treiber von RMD? Also, sie AMD publiziert 3D Shader und die Command Connection. Aber sie publizieren nicht all die Register-Documentation für die GPU. Und, ja, gut, wir haben ja den Code, der ist also die Dokumentation. Aber der ist leider unvollständig und da gibt es eine ganze Menge magische Nummern. Und es ist wirklich unangenehm, GPU-Treiber zu schreiben, indem man andere GPU-Treiber liest. Also was machen wir? Wir Google's. Also hoffen wir einfach mal, Google findet's. Weil Google weiß ja alles. Und eine ganze Menge Sachen findet man irgendwo in einem Forum oder in irgendwelchen Code-Dumps. Und was wir gesucht haben, ist diesen komischen Stringen hier, den RT-8X-GPU. Und es gibt neun Ergebnisse. Und der zweite ist der hier, der heißt Token. Silicon Code. Das ist ein XML-File. Und das sieht so aus, als hätte er die Bonner-Register-Dokumentation. Aber es ist kaputtes XML, es ist unvollständig, das hört einfach irgendwo aus. Aber was ist das hier? Und woher kommt das? Also suchen wir einfach mal ein bisschen mehr. Also Google, was weißt du über diese Webseite? Also zum Beispiel sowas, whatthehellyes.txt und whatthehellno.txt und XML-Style-Sheets. Und dann gibt's so ein Ding, das ist ganz unten, das heißt RAI.grammar.txt. Und es sieht so aus, als wäre es so eine BNF-Notation-Beschreibung für syntax von so nem internen Register-Dokumentations-File. Es sieht so aus wie ein AMD-internes Format. Aber es ist auf dieser Webseite. Okay, also wir haben diese beiden URLs. Also slashpragmatic-bonner-xml und slashpragmatic-RAI-RAI-grammar-4-txt. Also versuchen wir doch einfach mal pragmatic-bonner oder pragmatic-RAI-bonner. Ah, und in der Tat, da haben wir was gefunden. Also das ist eine vollständige oder fast vollständige Register-Dokumentation für Bonner mit Beschriftungen, Adressen. Und das sieht aus, als wäre das irgendwie eigentlich einem der internen. Also dieses Zeug ist wirklich, wirklich hilfreich. Denn jetzt wissen wir, was das Zeug alles bedeutet und was die Debugregister tun und so weiter. Das heißt, ich habe einen kleinen Pasa geschrieben für dieses Format. Also das aus diesem Ding hier ein XML geschrieben hat. Erst in PHP und das hat nicht funktioniert und dann hat er es noch mal in Python gemacht. Und man kann jetzt also ein Register-Dump nehmen und kann das mit dieser Dokumentation verbinden und man kann Dubs, Dumps, Diffen und so weiter. Und viele von diesen, also das ist total praktisch für alle, die AMD hacken, weil das über viele GPUs ähnlich ist. Also das ist großartig. Und jetzt haben wir also ein paar Dokumentationen. Wie kommen wir jetzt zu dem Framebuffer? Also benutzen einfach HDMI, das ist ganz einfach, oder? Also wenn man die CPU fragt, dann hat er Displayport und HDMI. Also vielleicht ist das nicht angeschlossen, aber das passt schon. Und wenn man die GPU fragt, dann ist HDMI nicht connected, aber Displayport ist angeschlossen. Ja, die haben tatsächlich einen externen Encoder, der HDMI nach Displayport geht, weil es zu einfach ist, einfach ein Kabel von außen an den HDMI-Port zu legen. Und deswegen machen wir da zusätzlich noch ein Encoder, der von Protokoll A nach Protokoll B umwandelt, einfach weile. Okay, also es ist ein Panasonic Displayport nach HDMI-Converter, der braucht ein bisschen Konfiguration. Okay, also es hängt irgendwie an der GPU, also das ist nicht so anders als in der GPU, man kann das nicht so großen Nutzen einnehmen, man kann es das nicht so macht. Also da sieht man dort die WLAN-Bestellungen. Ja, das sieht man da, und das sieht man auch hier. Also der hat ein Pin, der sich findet, ein web Also man schreibt da eine Nachricht an eine spezielle Stelle im Speicher und dann sagt man hier, die ist die Nachricht und dann schreibt das die Antwort irgendwo zurück. Also wenn man das Ding an und ausschaltet, dann... also wir haben jetzt eine zusätzliche Abhängigkeit vom GPU-Triber zu dem IOLA-Triber in zwei verschiedene Stellen und das ist alles ganz schrecklich durcheinander. Also I2C ist ein ganz einfaches Protokoll. Du schreibst ein Register, du liest ein Register. Nein, da machen wir jetzt noch eine Script-Engine dazu, die Bytecode liest, um I2C-Commands auszuführen. Warum? Warum? Naja, also weil ICC eben so langsam ist, weil es dann zwei Sekunden dauert, um HDMI hochzufahren. Ich verstehe es einfach nicht. Ich habe einfach keine Ahnung. Übrigens, dieses Ding hier hat Befehle, mit dem man Skripte in einem Skript ausführen kann, die passieren, wenn bestimmte Events passieren. Also yo, ich habe gehört, du magst Skripte, also habe ich Skripte gebaut, die du in deine Skripte tun kannst, damit du skripten kannst, während du Skript ist. Okay, also wir haben Code geschrieben, wir brauchen also noch mehr Hacks. Die Memory-Bandbreiten-Berechnung ist kaputt. Also dieses ganze zeige ich alles, aber wir kriegen am Ende ein Framebuffer. Okay. Und jetzt stellt sich raus, PS4 hat einen einzelnen großen Memory-Pool, die die GPU und die CPU sich teilen. Und die CPU wirft einfach Dinge in den Arbeitsspeicher und sagt, hey, GPU, renn da das mal. Und das macht irgendwie Sinn. Aber früher hatten GPUs Video, hatten explizites Videogramm. Und man kann das normalerweise in einem PC, kann man das in BIOS konfigurieren, um Videogramm zu konfigurieren. Und das ist halt bei der PS4 auf 16 Megabyte eingestellt. Das ist die niedrigste Einstellung. Das reicht höchstens für, also reicht nicht mal für einen Frame im Framebuffer. Das heißt, wir müssen den Memory-Controller jetzt umkonfigurieren, um das ein Gigabyte an das VRAM. Und was wir jetzt machen ist, wir bauen also im wesentlichen BIOS nach, wir konfigurieren die Northbridge. Aber immerhin, es funktioniert und X startet. Okay, also jetzt können wir endlich 3D machen. Ja, nein, also GPU-Beschleunigung, also 3D-Beschleunigung funktioniert noch nicht wirklich. Also immerhin haben wir jetzt den X aber gestartet, aber jetzt gucken wir uns halt mal die Radeon-GPU nochmal. Wenn man da mitmalen will, dann schickt man einen Kommando und das funktioniert im Wesentlichen, indem man in so einen Ring-Buffer schreibt. Und auf die Art und Weise kann man dann sagen, na gut, man schickt Dinge an die GPU und die macht es dann einfach, arbeitet es dann nach und nach ab. Und die GPU hat so einen Kommando-Prozessor, der diese Befehle einliest. Und da gibt es quasi einen zusätzlichen Befehlcode, der heißt F32 und darauf läuft ein spezielles Microcode-Firmware. Und am Ende sieht es, sieht jede Funktion so aus, na ja, also nimm dir diese Werte und tu mal irgendwas und dann geh wieder zurück zu diesem Ring-Puffer. Also spring dahin, lese es und dann geh wieder zurück. Und so funktionieren GPUs ganz allgemein, aber so, aber bei Radeon ist es eben insbesondere so. Und jetzt sagt der Treiber, Ring-0-Test fehlgeschlagen. Okay, und was ist das für ein Test? Der schreibt einen Register und sagt dann der GPU, schreibt mal diesen anderen Befehlen des Register und dann schaut er, ob tatsächlich dieser Wert in dem Register steht. Und dieser Schreibzugriff funktioniert halt nicht, aber aufgrund dieses RI-Files, was wir vorhin gehabt haben, gibt es Testregister, die wir benutzen können. Und es stellt sich raus, der Commandprozessor, also der Befehlsprozessor, der GPU, wartet darauf, dass andere Dinge dastehen, aber die sind da nicht. Okay, und es stellt sich raus, dass die Header von den Paketen eine Größe minus zwei haben. Also ein Paket mit einer Größe von zwei hat also die Größe null. Das heißt, sie haben noch zusätzlich ein einwortbreite Null-Operation geschrieben, die hat die Größe minus eins. Und Alter MicroCode interpretiert das jetzt als riesengroßes Paket, nicht als minus eins. Und in einer anderen Familie haben wir genau dasselbe Problem auch gesehen. Und das haben wir also repariert und jetzt sagt der Ringdreitest geht kaputt und das ist derselbe Test im Wesentlichen, nur dass es jetzt zum SDMR geht, macht es selber. Also er schreibt einen Wert hin und sagt hier, schreibt mal einen anderen Wert dahin und schaut dann, ob der Wert da jetzt drin steht. Und dieses Mal passiert der Schreibzugriff, aber es steht trotzdem null drin. Also haben wir versucht, einfach zwei Schreibzugriffe gleichzeitig anzuweisen. Und was passiert ist, schreibt mal eins auf diesen Wert und schreibt mal eins auf den anderen Wert. Also es soll eigentlich Dead Beef schreiben, aber es schreibt nur eins aber zum ersten Ziel. Und sollte Dead Beef schreiben, aber es schreibt halt diese eins noch. Und es schreibt sich raus, die haben in dem SDMR Kommando Pasa einen Fehler, der einfach vier Worte hinter das Wort schreibt, was er eigentlich sein sollte. Also versuch einfach mal, das hat Stunden gedauert, ja, versuch einfach mal zwei Kommandos, schreibt eins, eins. Okay, also es schreibt vier Worte zu weit hinten, aber nur in Ringpuffern. Und das ist gut, weil da können wir einfach außen rumschreiben, indem wir halt einfach einen Fill-Kommando benutzen, statt dem Schreibekommando, wie machen Sie diese Fehler überhaupt? Also die GPU funktioniert aber immer noch nicht. Der Test funktioniert, aber wenn man versucht was zu malen, dann kriegt man eine ganze Menge Page forts. Und es stellt sich raus, man kann von Kommandos in der CPU nicht in Register schreiben. Also man kann direkt von der CPU in den Register schreiben. Aber man kann nicht der CPU sagen, bitte schreibt denn dieses Register. Also kann die GPU nicht den Speicher sehen, also ist alles kaputt Linux benutzt, freebase dir nicht, deswegen sieht man es jetzt erst. Wir können direkt von der CPU Dinge schreiben. Wir vermuten, das hat was mit irgendeiner Art Firewalling zu tun, dass es irgendwie nicht mehr synchron ist. Das ist alles ziemlich hacky, ich würde das gerne reparieren. Also vielleicht ist diese Firewall irgendwo in der Firma, aber die Firma ist halt proprietär und undokumentiert. Also was ist das für ein Ding? Naja, es ist undokumentiert, es braucht Microcode. Also nehmen wir mal die Blobs von FreeBSD, das heißt wir müssen die nicht mit ausliefern. Und jetzt gucken wir mal tiefer rein in diese Blobs. Also was machen wir? Wir probieren einfach mal eine Instruktion aus und gucken mal was das gemacht hat. Und wir haben F32 Firmen, wer die genau das macht, also die einfach aus einem bestimmten Zustand startet, dann Befehl ausführt und dann die Register wieder zurück setzt und das systematisch ausführt. Also wir haben F32 Dis geschrieben, das ist ein Disassembler für diesen F32 GPU Microcode. Also das kommt euch vielleicht bekannt vor, wenn ihr Arm-Assembly lesen könnt. Und das kann also tatsächlich alle Instruktionen in Liverpool und Bonaire rekonstruieren. Das ist soweit, ich weiß noch nie gemacht worden vorher. Und das ist das erste Mal, dass ich das erwähne. Also AMD und Intercranel Entwickler sind normalerweise die einzigen, die das Wissen haben. Also ihr könnt diese Desktop-GPUs auch damit disassemblieren. Und das kann also auch interessant sein für GPU-Dinge, die nicht auf der PS4 passieren. Und das stellt sich raus, dass Register blockieren passiert nicht in der Firmware. Also es scheint bei einem bestimmten Fällen einfach in der Hardware aufzutreten. Ich habe versucht, da außen rumzuarbeiten. Ich habe versucht, einfach ein paar einzelne Werte zu setzen von einer anderen GPU und dann zu hoffen, ich kriege da irgendwie magische Werte bei denen es dann funktioniert. Aber ich habe das gefunden. Also wie gesagt, das funktioniert mit diesem CPU-Schreib, mit dem CPU-Right Workaround, den ich vorher besprochen habe, immerhin kriegen wir 3D, aber naja, also hübsche Systeme. Also was funktioniert? Wir haben Interrupts, Timer, die wichtigen Dinge, die wir brauchen, damit überhaupt ein Betriebssystem läuft. Wir haben ein Serienport, wir können es runterfahren und neu booten. Und das klingt lustig, aber das benutzt ECC, also da ist interessanter Code mit drin. Also es ist erst seit 4 Stunden, weil es war auch ein bisschen doof, immer den Stecker zu sehen. Also der Stromknopf funktioniert, USB funktioniert, es fehlt. Also es ist tatsächlich eine ganz witzige Story, weil es hat irgendwie, also irgendjemand hat von der USB Not Working Branch Dinge geholt und plötzlich hat es funktioniert. Also haben wir es wohl bei irgendwas anderem repariert, obwohl das gar nicht reparieren wollte. Und DVD funktioniert, ich habe 20 Minuten gebraucht im Hack Center jemanden mit einer DVD zu finden, scheinbar bin ich aus der Vergangenheit, weil ich noch DVDs benutze. WLAN funktioniert, Ethernet funktioniert, aber halt nicht bei Gigabits Geschwindigkeit, Framebuffer funktioniert. 3D funktioniert mit diesem hässlichen Register Schreibzugrufshack und SPDIF Audio funktioniert, das ist ganz gut, HDMI Audio funktioniert nicht. Das liegt daran, dass Audio überhaupt noch ziemlich hässlich ist, das hat funktioniert erst seit sehr kurzem und ich habe den Encoder noch nicht fertig geschrieben. Und die Echtzeit Uhr funktioniert nicht. Und wenn ich jetzt denke, das ist einfach, weil Uhr irgendwie ein einfaches Gerät ist, ist sehr kompliziert von Sony implementiert. Das heißt, statt dass man einfach sagt, man wiesst oder schreibt die Uhrzeit in der Uhr, speichert man tatsächlich, also man kann die Uhr nicht schreiben, sondern man kann nur sagen, es gibt einen Unterschied zur Uhr, die aktuell gesetzt ist und möglicherweise ist es auch noch an einer bestimmten Speicheradresse, die wir nicht gefunden haben, möglicherweise ist es auch irgendwie verschlüsselt. Also, dass die Uhr tatsächlich die richtige Uhrzeit anzeigt, das ist tatsächlich sehr, sehr schwierig. Und wir haben Blinkenlites, das ist natürlich auch sehr wichtig. Also, der Code, man kann den PS4X Code auf den GitHub bekommen und das hat dann auch die Hardware-Konfiguration, also, man kann die PS4X Code auf den PS4X-Branche, das ist dann dann basiert auf 4.9, das ist die letzte offizielle Version von Windows, du kannst den Radeon-Patch bekommen von uns, es ist eine user-spaceletten-Patch, und die RAI und R32-Distink, das habe ich mentioned, du kannst die Radeon-Tools bekommen, auf dem GitHub-Repo, das ist ein Pository, wir haben das gerade so geladen. Und ihr könnt wahrscheinlich, sollte das Fire wahrscheinlich runterladen und mal laufen lassen, bevor die Radeon-Leute das runterladen, herunternehmen muss. Also, das war's. Das war die ganze Geschichte, wie wir Linux auf der PlayStation 4 zum Laufen gebracht haben und ihr könnt uns erreichen auf der Webseite Danke schön. Ich hoffe, das war nicht zu schnell, ich musste mich beeilen um meine Opto99-Seite zu kommen. Ich wollte eine Demo, naja, das war ja eigentlich alles Demo, aber wir können was anderes versuchen. Also, vielleicht gehen wir hier mal aus der Präsentation raus. Es ist nicht für die Maus gedacht. Wir haben dieses kleine Icon hier, mal sehen was passiert, wenn ich darauf klicke. Ich will noch schauen, ob WLAN funktioniert. Wenn wir kein WLAN haben, dann wird das nicht richtig funktionieren. Also, wir haben WLAN. Was passiert, wenn wir das klicken? Es dauert ein bisschen, bis es dead. Also, wenn ich weiß, dass gerade passiert ist, er hat Steam gestartet. Also, die CPUs auf diesen Dingen sind ein bisschen langsam, aber schaut euch das an. Also, jetzt ist es eine wirkliche Game-Konsole. Also, das war jetzt SteamOS, was er gestartet hat, glaube ich. Also, hier haben wir es. Also, wir können ein paar Fragen nehmen. Es dauert eine Weile, bis das hier lädt. Wir können vielleicht ein Game laden, aber in dessen können wir ein paar Fragen beantworten. Sollen wir mit einer Frage vom Internet anfangen? Die Internet würde gerne wissen, ob deine Nachforschung publiziert werden oder privat bleiben. Ja, also, das Publizieren ist den Code, den ich gerade beschrieben habe, der auf GitHub ist. All die Treiber, die wir geschrieben haben und der ganze Code, der ist alles auf GitHub. Wenn ihr wirklich wollt, dann kann ich ein paar Wiki-Pages darüber schreiben. Das Interessante daran ist wahrscheinlich diese Webseite, die ihr von der AMD über die AMT-Grafik hatte gefunden hat. Wenn ihr irgendwelche speziellen Fragen hat über irgendein gewisses Gerät oder irgendwelche Details, dann könnt ihr mich einfach fragen. Es wäre nett, wenn wir ein paar Dokumentationen schreiben würden, aber der Code, den wir auf GitHub haben, ist ziemlich sauber und das sollte reichen für euch. Wenn ihr Fragen habt, dann geht bitte zu den Mikrofonen. Nur eine kleine Frage. Wie wahrscheinlich ist es, dass du einiges von diesem Zeug in den Linux-Körnern bereiten kannst? Also, es gibt zwei Seiten zu diesem Zeug. Also, das eine Problem ist, dass ein Teil von dem Code ein paar richtig schlimme Hexen hat. Wir würden es gerne upstream, wir müssten es wirklich hinsetzen und das tun. Ich glaube, dass meistens von diesem Custom X86 Code und den Treibern und den Interrupt-Hex okay ist. Also, es ist wahrscheinlich nicht besonders schlimm. Das Radionzeug ist ein bisschen fischig, wegen dem Encoding-Zeug. Die AMD-Treiber-Entwickler, die für AMD arbeiten, wollen nichts damit zu tun haben. Sie können uns nicht wirklich daran hindern, etwas upstream in den Linux-Körner zu bringen. Also, solange wir den ganzen Code in den Zustand bekommen, wo es machbar ist, könnte es funktionieren. Also, wenn dann geht das nicht Grafikkartenzeug zuerst in den upstream und wenn wir jeder zu Zeit haben. Mikrofon 1, eins bitte. Also, ich denke, du solltest wirklich den Entwickler von Hex suchen, den PS4-K-Exec benutzt für Hex dann statt Linux. Aber das war eigentlich nur ein Witz. Also, folgendes. Ich benutze Gentoo auf meiner Hauptmaschine, auf fast allen Maschinen, die mir wichtig sind, benutze ich Gentoo. Aber der Grund, warum ich Gentoo benutze, ist zum einen, ich mag das und ich benutze es. Und das ist halt super einfach, Patches in Gentoo mit reinzubringen. Man nimmt einfach die Patch-Files, legt sie in das Portsverzeichnis und dann hat man das Paket schon fertig. Und es ist halt super einfach, Gentoo zu patchen, das ist halt einer der Hauptgründe. Nummer 3, bitte. Will there be new exploits, new way to boot Linux werden dann noch weitere Exploits sein, noch mehr Wege, Linux auf der PS4, weil nur einen Heck in der X86 zu empfinden ist. Also, das waren nur 4 Punkte. Aber unser Ziel ist es, zu fokussieren auf die Story von dem. Also, der Grund, warum wir den exploit nicht veröffentlichen oder warum wir uns in der exploit-Szene nicht breit machen wollen, ist ganz viel Drama und es ist nicht so viel Code. Also, wir wissen eine ganze Menge Leute, dass die auf verschiedenen Firmen während des Zeugs rekonstruiert haben. Also, wir müssen dann nicht den exploit anbieten und wir wollen da einfach auch nicht mit anfangen, denn das ist einfach immer nur Drama und das wissen wir auch schon. Also, deswegen macht es einfach selber, bitte, dieses Mal. Und die Frage geht nochmal ans Internet. Was macht das Internet? Das Internet möchte wissen, habt ihr jemals Spaß gehabt mit dem BSD, als auf dem zweiten Prozessor läuft. Und das ist eine gute Frage. Also, ich selber habe das wohl mal gemacht, aber ich weiß nicht, ob sonst mal jemand gemacht hat. Also, es gibt ein Kommando, mit dem man da in FreeBSD reinkommt und man kann da sicher viel Spaß damit haben, aber wir haben da nicht wirklich viel damit gemacht. Und jetzt geht es zum Mikro 5. Ich frage mich, kann man das auch an die PS4 VR-Edition anwenden? Also, diese neue, habt ihr das mal getestet? Also, es gibt eine, die PS4 Pro, also Linux bootet auch auf der PS4 Pro, aber die GPU funktioniert nicht und wir hätten gerne, also, wir möchten das gerne portieren, aber es ist wahrscheinlich nicht sehr schwierig, aber, also, wie ihr sehen könnt, funktioniert 3D. Also, man muss in dem Spiel hoch und runter gucken, scheinbar. Ja, nochmal eine Frage von Mikro 3. Ich würde gerne wissen, ob ihr das auch, also die Radeonpatches auch auf die neuen AMD GPUs übertragen wollt, denn AMD unterstützt jetzt auch die andere GPUs. Ja, also der Versuch war ursprünglich, das auf Radeon GPUs zu übertragen. Und Sie haben das experimentell unterstützt und angeblich sollte das auch funktionieren. Ich würde das gerne, also ich würde das auch gerne auf AMD GPUs übertragen. Also, nicht, dass wir das schon hätten, aber wenn wir es aufgeräumt haben in Code und wissen, wo alle die Schalter sind, dann würden wir das gerne portieren, aber neue Generationen dann könnte möglicherweise noch zusätzlicher Probleme auftreten. Okay, nochmal eine Frage aus dem Internet. Also, vor einem Jahr hast du diskutiert mit jemandem auf Twitter, dass es kein PC ist und jetzt sagst du, es ist so ein Stück weit einer, was ist da los? Und naja, mein Grund ist, es ist kein IBM-PC-Kompatibles-Gerät. Es ist ein X86-Gerät, das zufällig auch irgendwie strukturiert ist wie ein aktueller PC. Aber wenn man sich die Details anschaut, dann ist es wirklich sehr, sehr unterschiedlich. Also, wir mussten da tatsächlich auf Linux diese Subarchitektur definieren. Also, es ist X86, aber kein PC. Und das ist eine wichtige Unterscheidung. Also, viele Sachen sind X86, aber eben keine PC. Also, die Chance ist groß, dass ihr bei eurem PC zu Hause eine X86-CPU hat. Okay, also letzte Frage aus dem Internet. Und die Frage ist, ob es irgendwie Verschlüsselung notwendig war. Nein, nein, nein. Man exportiert es und man landet dann im User-Mode und dann macht man einen Exploit und dann landet man im Kernel-Mode. Also, es gibt keine Sicherheitsfeatures, die dich davon abhalten, das auszuführen. Also, es gibt natürlich die Sandbox in FreeBSD, aber die kann man einfach umgehen. Es gibt keinen Hypervisor, keinen Monitoring, der irgendwie dafür sorgt, oh, dieser Code sollte da gar nicht laufen, keine Integritätschecks. Es gibt eine Sicherheitsarchitektur, aber wie das üblich ist für Sony, also die PS3 war besonders, weil dieser Jailbreak war im Wesentlichen ein Piracy-Device. Und die benutzt einen Exploit im Kernel und nur im Kernel, um dann Piracy zu ermöglichen, also Raubkopien. Und der einzige Grund, was zu machen, ist tatsächlich, um Raubkopien zu ermöglichen. Und das interessiert mich nicht. Aber es stellt sich halt raus, dass Sony einfach von Sicherheitsarchitektur keine Ahnung hat. Okay, und das wär's. Ganz herzlichen Dank, damit ist der Talk zu Ende. Aus der Übersetzungskabine verabschieden sich Tribut.