 Donc, Marcus, tu as été ici avant, tu as cassé une Wii, tu as cassé une PS3 et eu quelques petits soucis l'ego, qu'on ne sent dans aucun fondement. Et tu as niqué, et désolé pour mon français. Donc tu as niqué la Wii U et le console hacking de 2016. Donc ça commence. Je suis un type paraisseux, je n'ai pas encore allumé mon ordi pour les slides. Donc laissez-moi faire ça, ça va peut-être marcher j'espère. Donc mon ordinateur un peu bizarre, il y a beaucoup de logiciel open source qui tourne dessus FreeBSD. Il a des trucs comme OpenSSL, MGNX dessus et Cairo et WebKit. Il y a beaucoup de logiciel open source qui tourne dessus. Et on sait tout ce que BSD est en train de mourir, donc on peut le transformer en quelque chose de plus intéressant et espérons faire une présentation dessus et voir comment ça fonctionne. Pas mal de rire dans la salle. Donc on commence avec un écran noir. Donc le système de fichier se charge. Et voilà, ça bout. Et oui, j'utilise Gen2 Linux. Est-ce que le wifi fonctionne un instant ? J'espère. NTP, oui, non NTP. Bon, ça va marcher, ça fait chier, mais ça fonctionne. Allez, ça prend un peu de temps à démarrer, il n'y a pas de système D, vous savez. C'est le sein, c'est plus lent mais c'est le sein. Ok, voilà. Est-ce que ma manette fonctionne en un instant ? Le Bluetooth. Ok, ça fonctionne. Ok, donc on commence. Donc console hacking 2016, PS4, PC Masterways. Je m'excuse pour l'horrible blague nazi dans le titre, mais bon, c'est un truc d'Internet. Donc PS4, c'est un PC ou c'est un PC ? Mais bon, avant de commencer, j'aimerais dédié ce talk à Ben Bayer qu'on connaissait sous le pseudo de Bushin qui est malheureusement décédé en février dernier. C'était un grand hacker, il était là beaucoup de congrès. Une des personnes les plus sympathiques que j'ai rencontrées. Et je suis sûr qu'une bonne partie d'entre vous serait d'accord avec ça. Et c'était pas pour lui, je ne serais pas ici aujourd'hui, donc merci beaucoup. Ok, donc la PS4, c'est un PC, c'est pas un PC. C'est un peu différent des consoles précédentes. C'est un X86 avec FreeBSD, avec Webkit. Il n'y a pas d'hyperviseur, malheureusement. Mais bon, la PS3 en avait un, ça ne servait à rien, donc bon. Donc c'est différent de la PS3, mais ce n'est pas totalement différent. C'est un processeur de sécurité qu'on peut ignorer parce que ça ne sécurise rien. Donc ça va. Ok, donc comment est-ce qu'on poutre une PS4 ? On écrit un exploit Webkit et un exploit FreeBSD. Et bon, tout tourne sous Webkit et FreeBSD n'est pas spécialement l'OS le plus sécurité. Et pas avec les personnalisations de Sony. Donc bon, c'est chiant, c'est embêtant, quoi ça sert de faire ça. Donc à la place, ce temps, on va parler de quelque chose d'un peu différent. Petitain, une fois qu'on a notre exploit, étape 3. Quoi ? Ettape 4. Profit. Mais quoi ? C'est sur quoi ? Donc avant d'écrire un exploit, il faut qu'on ait le code qu'on veut exploiter. Avec Webkit et FreeBSD, on peut, mais leur build à la custom, c'est un peu compliqué d'écrire un exploit quand t'as pas un lébinaire. Donc il faut commencer par dumper le code. Comment on fait ? Donc étape 0, extraction de code en black noir, en s'amusant. Il y a très longtemps dans un curse-pice très, très lointain. FeloReflo, c'est rencontré après le transfert, c'est 3. Et on a regardé la carte mère. Donc on a un SAS BH. On a un APU, le processeur principal, Liverpool, qui fait GPU et CPU, que AMD fabrique. Et ensuite, le SAS Brick se connecte à toutes les merdes, USB, HDD, qui est connecté en USB pour une raison très bizarre, inexplicable. SATA USB, puis USB SATA. Bon, il y a du SATA. Bon, le lecteur Blu-ray, lui, il y a du SATA, on a du Wi-Fi et du Bluetooth en GMI. Pardon. Ah, et on a X screen saver, non. Donc le screen saver fonctionne, c'est cool. Je pensais que je l'avais tué, attendez, je vais le killer vite faire. Et il fallait bien quelque chose foire. Oui, je pourrais rentrer en SSH sur la PS4, voilà, c'est fait. Donc, du coup, quelle interface vous allez attaquer? Bon, USB, SATA, STIO, GMI. C'est sous contrôle du CPU, il balance des commandes, le device répond. Le device ne peut pas faire grand-chose. Donc on ne peut pas écrire à la mémoire depuis le device. Donc on peut exploiter l'USB si on a un bug dans la file USB, mais bon, on a toujours le problème de ne pas avoir le code. La GDR, ça pourrait être cool d'écrire, mais c'est un bus très rapide. On peut l'exploiter si tu fais un système sécurisé. Ne part pas du principe qu'on ne pourra pas poutrer le GDR4, mais ce n'est pas le chemin à la plus faible résistante. Par contre, il y a un truc qu'on appelle PCI Express au milieu, là. Intéressant. PCI, c'est très drôle pour toute la famille. Donc c'est du bus master, ça peut faire des accessés directs de mémoire. C'est compliqué, les trucs compliqués sont difficiles, c'est robuste. Les gens pensent que PS2, PCI, il y a un truc que vous dout. Non, non, non, non, c'est... On peut connecter à la rache avec de la ferraille. PCIe, ça fonctionnera sur des cours de distance. Ce n'est pas si sensible que ça. Ça tolère bien les retards, les délais. Donc on peut prendre son temps pour répondre. Et il y a plein de merde dans les drivers, parce que personne prend le temps de bien écrire les drivers. Il devrait être bien écrit, parce que des gens font des méchants pilotes. Mais bref. Donc à quoi il sort le PCI? Il connecte la motherboard au FPGA. Il connecte aussi l'APU... Pardon, il connecte l'APU au FPGA et la carte mère à Sousbridge. Et on peut le manager pour le faire passer en vitesse 1. Comment est-ce qu'on connecte la carte mère au FPGA? On peut le faire de plein de façon. Mais voilà. Est-ce qu'il y a des gens ici qui ont fait du hardware hacking? À peu près la moitié de la salle lève la main. Quand vous haquez du hardware, après avoir fait clignoter une LED, quelle est la première interface que vous utilisez pour parler à votre ressortoir? Le port séries. Et donc on peut faire tourner du PCIe Express sur le port sérier à 100 kilobytes en point 002X. Ça tolère bien les DL. Il y a un port gigabit Internet sur le FPGA, mais bon, après j'ai fait ça. Pour l'instant on a du PCIe 0.0002 dans une direction et en point 0.05 dans le direction. C'est asymétrique, le plus asymétrique du monde. Mais ça fonctionne, c'est marrant. Et sur série, ça marche. Ça fonctionne bien, c'est cool. Donc PCIe Express, c'est un réseau de paquets switchés qui fonctionnent, qui utilisent des paquets nous autres l'actions. Ça peut faire des accès en lecture écriture, mémoire, dans les IOs. Ça peut faire dans les registres de configuration. Ça peut envoyer des interruptions de signalisation de messages. Il y a des interruptions legacy qui émulent les vieux systèmes, ce pin en high, une interruption, etc. Et les completions qui sont les réponses des lectures. Donc faisons les dingues avec les accès direct en mémoire et donpons le noyau. Il va protéger les périphériques qui vont juste te laisser accéder la zone mémoire qui est mappée à ton périphérique. Ça ne va pas te laisser lire n'importe où. Mais ce n'est pas parce qu'il y a une IOMMU qui est utilisée correctement par Sony. Le pseudo-code de Sony alloue un tampon sur la pile et s'il vous plaît, écrivez. Est-ce que vous pouvez voir le problème ? Ça ne va pas. Ils m'apprent par page entière et ils ont mappé que 64K de leur pile et donc on peut faire de la DMA directement dans toute la pile. On a l'exécution de code, on a le dump du noyau, on a WebKit et les dumps des bibliothèques systèmes. Donc c'était l'étape 0. Mais ce n'est pas la PS4. C'est un truc avec line cap partout. Ce n'est pas un bel exploit. Donc après ça, qu'est-ce qu'il y a ? Il faut qu'on fasse quelque chose. On a envie de faire tourner Linux. Quels sont les différences entre FreeBSD pour passer FreeBSD à Linux ? Quatre. Donc on jump dans Linux. Il faut charger Linux dans des par contigues de la RAM. Il faut configurer les paramètres de boot. Il faut éteindre correctement FreeBSD, allumer et éteindre le CPU secondaire. Nouvelle table de pagination. Quand on a fait tous les nettoyages magiques, on a un joli état pour Linux. Jumple Linux. Techniquement, on a jumpé dans Linux. Il va tourner pendant un petit moment. Ça va s'arrêter. Il n'y aura pas de sortie vidéo. Parle en matériel. Qu'est-ce que c'est le X86 ? C'est d'instruction médiocre. C'est pas mal. Qu'est-ce que c'est un PC ? Un PC est un truc affreux composé de trucs legacy de 1980. La PS4 est définitivement pas un PC. Mais... Qu'est-ce que c'est ? Un PC, un legacy PC, un PC legacy interrupt controller, un PIC. 8259 PIC. Il y a une horloge ton réel, un UART, un BUSISA, un VGA. Même si vous pensez que vous n'avez pas d'ASA sur votre ordi, vous en avez. La PS4 n'attrape pas tout ça. Qu'est-ce qu'on fait ? Comme on fout sur un PC. C'est un PC facile. C'est un APU. Il y a une interface basicale du PC Express. On a des périphériques du SATA. Ça ressemble un peu à la PS4. Vous pouvez dire que ça pourrait être un avantage. N'oubliez pas toutes les merdes que j'ai dit sur la PS4. Leai simultaire à FCH de chers AMD impliante un legacy Intel. Par contre, le southbridge etolia implémente un autre legacy de chez Intel de 2002. Ce n'est pas un southbridge, c'est un Systemon Chip Armada Marvel. Ça n'a jamais été un southbridge, un CPU. C'est un CPU qui est un descendant du strongarme du exquel de chez Intel. Intel, c'est un arme avec des périphériques intégrés, ils ont mis un pont PC Express sur le côté et maintenant on peut utiliser toutes mes saloperies de chez-armes pour le monde x86, ils ont rajouté 2-3 trucs qui étaient nécessaires, la CPU, la spette et 256 mecs de RAM. Et ils se trouvent qu'il y a aussi FreeBSD qui tourne en standby sur le chip. Et c'est comme ça qu'ils télécharge du contenu en tâche de fond parce qu'en fait ils ont un deuxième OS sur une plus à part en standby, mais c'est vraiment de la merde à l'intérieur, c'est totalement fou, pardon. Donc, récapitulatif, numéro de bus, un numéro de bus, 8 bits, un numéro de device, 5 bits, un numéro de fonction, 3 bits, ça c'est le PC. Donc, un softbridge normal, un contrôleur SATA USB, etc., avec quelques périphériques. Donc, un softbridge, ça fait passer pour plusieurs périphériques. On a juste besoin d'avoir un numéro de fonction et on peut en avoir que 8 dans un device. Donc, le softbridge dit, je suis le device ground 2 et hop et voilà. Si on fait un lspci sur un noyau Linux standard sur la PS4, on shoppe un truc un peu comme ça. Donc, Léolia se clone dans tous les devices PCI Express parce qu'ils avaient la flemme de faire if-device-égal-machin-device-else-dentry-bytes, non, déjà c'est, pardon, répandez à tout. Voilà. Linux voit le softbridge, voit 31 fois le softbridge, ce qui est un peu emmerdant. Différents de colonnes, le même et ensuite, il y a 8 fonctions, PSI Express, PSI, 8 fonctions. Ok, les 3 bits sont utilisés. En fait, 8 fonctions, ça ne suffit pas forcément pour tout le monde. La fonction 4, PCI Express, GLOO, fait pas mal de trucs, HPET, flash, RTC, Timer, de port série, de C, tout ça sur un seul device PCI Express. Donc, Linux a des récroyements au système minimum, il faut un timer, il faut des interruptions, il faut une console. Il n'y a pas de bits, il n'y a pas de pique, il n'y a pas de céréales standard dans la PS4, donc les trucs ne vont pas fonctionner. Par contre, il y a des points de test pour un port série dérivé du 8, de 5, 0 sur la 4. Donc, Linux a earlycon, on peut pointer sur une console de debug assez tôt, il n'y a pas besoin d'ailleurs que pour ça, c'est juste un paramètre à passer au bout, avec le type, l'adresse, la vitesse, et bon, la vitesse en kilobot est différente. Leur clock fonctionne pas pareil, quand on dit 3200 ça veut dire 115200, au final, on arrive, on a des messages, on voit Linux booter, on a bootlog. Ok, on a besoin d'un timer. Sinon, tout se casse la gueule. Donc, Linux supporte le TSC, un compteur incorporé au CPU, la PS4 là, mais Linux se laisse de la calibrer sur le timer legacy qui n'existe pas sur la PS4, donc ça échoue. Bon, la PS4, c'est pas un PC, encore une fois. Donc, il faut implémenter une nouvelle sous-architecture qui dit ok, ce n'est pas un PC, c'est un PS4. Et bonjour, dit le bootler, je suis une PS4, et le convainc dit ok, je ne vais pas faire la calibration à l'ancienne, je vais faire une calibration toute spéciale pour la PS4 qui va la calibrer sur les timers de la PS4 et qui désactive la mère de legacy. Ok, c'est officiellement plus un PC à ce stade. Ok, donc on va parler d'ACPI, vous en avez peut-être entendu pour toutes ces folies Microsoft Intel, la plupart des gens associent ça à la mise en veille à Libération, mais ce n'est pas juste le power, ça fait aussi d'autres trucs. On a besoin d'ACPI pour la configuration des IUM MI PCI pour l'ajustement des fréquences CPU et bon, la PS4 a des tables cassées parce qu'ils ne les utilisent pas, donc on va les réparer. Ok, exact. Ok, on a réparé, on a céréales, on a les interruptions, on a les trucs. Les MSI, c'est des trucs tout nouveaux où on écrit une valeur, on dit au device quand on veut faire une interruption, écrit cette valeur à cette adresse, le device peut le faire et le contrôle de la interruption voit et oh, c'est plus une interruption et transfert lève l'interruption dans le CPU et c'est super, c'est efficace, c'est rapide. Et on obtient dire, on répond au CPU, le vecteur d'interruption, c'est comme ça que la PS4 fait le MSI. Léolia ignore totalement les registres de configuration MI, mais à son autre système, une fonction 4, qui a été mise comme ça, qui implément un controller MSI à la compte. Chaque fonction, une adresse mémoire partagée et maximum de 27 bits de données, chaque sous-fonction a seulement accès aux 5 bits de pas faible et tous les MSI viennent de la fonction 4. Donc de là à là, c'est ce device qui a ses interruptions, puis c'est ce device-là, mais pourquoi ils ont fait ça sérieusement ? C'est n'importe quoi, on ne voit pas les yeux dans la police. Driver, la folie des drivers, donc des périphériques sont interdébendants alors qu'ils ne sont pas liés, l'allocation des vecteurs d'interruption n'est pas séquenciel, il faut médifier tous les drivers pour utiliser des systèmes IRQ que ce tome, c'est vraiment embêtant. Donc on a un driver principal qui est un play-mote, l'interface du controller IRQ, on s'arrange pour qu'il se charge en premier, on peut faire ça dans Linux, on peut patcher les drivers pour qu'ils utilisent ça, on n'en paquette le tout pour qu'ils utilisent ce machin qu'on va faire, et des détails techniques. Donc on peut dire, oh un intervier, l'input d'auro, donc c'est génial de passer conceptif 1, 2, 3, 4, 5, il y aura les mêmes bits au top, donc il faut qu'on fixe la table mais ça fonctionne, donc ça nous donne des interrupts et ça fonctionne, c'est cool. Voilà, on a les interrupts, les timers, les serials, les IRQs, les ministres MFS, on peut en mettre dans un binel, dans le carnel et hop, ça boutera, on aura une console, parfait. Et des fois ça frise, qu'est-ce qui se passe ? Les entrées sortissent. En fait, FreeBZ masque, une partie des interruptions avec des fonctionnalités locales à pique AMD non standard, donc il faut aussi nettoyer ça au cas exact, et là, le porc série est stable. Ça rend plein de temps de débuguer ça. On a dumpé les registres et tiens, FFFF ici et pas là, qu'est-ce que c'est que ça ? Mais oui, remonter la pile pour trouver ça, c'était vraiment chiant. Donc on a la base, on a une plateforme, on peut lancer un Linux totalement basique, on ne peut rien faire d'intéressant, il faut rajouter des pilotes. Donc USB, on a trois contrôleurs dans une fonction, on a du SDHCI, il me confie en très sorti non standard pour le Bluetooth de Wi-Fi, les airnets est à peu près cassé, mais bon, si on bricole le driver ça va tourner, et ça fonctionnait bien sous Linux 4.4, et il y a trois jours j'ai essayé de faire un rebase pour avoir le tout dernier et le tout meilleur, et sous la 4.9 c'est cassé, est-ce que la DMI est cassée, qu'est-ce qui se passe ? Je sais pas. Et c'est le retour d'Eolia, Eolia contre-attaque. Donc l'Eolia, normalement ça ressemble à un Systematip Arm, c'est pas un périphérique, c'est son propre système, ça map les deux gigas inférieurs de son espace Pémoire sur le PCI, et le PCI a une petite fenêtre dans ses registres qu'elle utilise pour contrôler ses devices. Donc si c'est mappé au même endroit, ça fonctionne. Mais maintenant qu'on a un IOMMV, dont on a besoin pour les interruptions, il a inséré son propre espace Pémoire au milieu tout ça, et mappé ce que vous voulez ou vous voulez, c'est génial. On a une table, cette adresse elle va là, etc. Et donc Linux va chopper des adresses en bas de l'espace mémoire de l'IOMMV, la page 2 elle va là, la 3 elle va là, etc. Ok, périphérique, tu peux écrire à telle ou telle page, et donc ils vont à cette page sur X86, ça marche bien. Et quelque part entre la 4.4 et la 4.9, il a commencé à fonctionner comme ça, mappé depuis le haut de l'espace au lieu du bas. Et c'est bien pour l'IOMMV, mais ce n'est plus dans la mémoire, c'est plus dans la fenêtre. Donc tu dis à Ethernet, fais du DMA sur l'adresse FFF, et au lieu de faire du DMA au bon endroit, au mauvais, ça ne marche plus. Et en gros, la IOMMV fait du DMA sur 31 bits et pas 32. Ok, pourquoi, pourquoi, mais c'est totalement dingue, mais sérieux. Il y a plein de trucs qui utilisent ça dans Linux, donc plâcher plein d'endroits, ça fonctionne, mais ça fait mal quoi. Ok, périphérique, ça fonctionne maintenant pour quelque chose de totalement différent. Je peux me dire quel est ce personnage, c'est Starshaw. Et c'est le nom de code de la radio de la PS4, un de ces noms de code. Apparemment, ils en ont plusieurs, ils ne sont pas d'accord sur lesquels c'est. Il y a certains endroits où c'est Liverpool, d'autres où c'est Starshaw, d'autres où c'est BJ. On pense que Sony l'appelle Starshaw, KMD l'appelle Liverpool, mais on sait pas trop, on l'appelle Liverpool partout comme ça, on sait de quoi on parle. Ok, donc ce GPU, il fait quoi ? C'est un CPU AMD de la génération CIslound, écréé car c'est parce qu'il y a déjà le S de prix. C'est similaire aux autres chips de sa génération, donc c'est pas un truc totalement fou, totalement nouveau, mais il a quelques bizarris, quelques sub-summitations. Donc on a pris Bonner qui est un CPU qui est déjà supporté par Linux comme base et ok, fait tous les trucs Bonner et change les trucs et on va essayer de l'adapter à la PS4. Donc hackez les drivers AMD, ils sont en pen source mais ils publicent pas la documentation de leur registre. Donc on allait comment dans user space de programmation 3D, mais pas celle des registres serveurs dont on a des registres noyaux dont on a besoin quand on va faire des drivers. Vous pouvez penser d'aller lire le driver Linux, c'est OMS, c'est pas complet, il y a des nombres magiques de partout, on ne sait pas si il faut écrire un nouveau registre, c'est vraiment nul d'essayer d'écrire un driver en lisant un autre driver qui n'est pas documenté quoi. Donc on fait quoi ? On utilise Google, on est des hackers, Google c'est tout et toutes les bizarris qu'on peut trouver sont sur le forum, on a Google cette petite string R8XGPU en double côte et on a 9 résultats et le deuxième c'est ce silicone kit token, c'est un fichier XML, si on regarde ça a l'air d'être un dump de la configuration de registres bonnets mais c'est cassé, c'est incomplet, ça arrête à un endroit. Qu'est-ce que ça fout là ? Ça vient d'où, c'est quoi ? Qu'est-ce que tu sais sur ce website Google ? No.xc, 8.xc, qu'est-ce que c'est que ça ? Des feuilles de cils XML, il y a un truc qui s'appelle ria.grammar.xt, c'est quoi ? Mais c'est la grammaire en notation de description, la syntaxe, documentation de registres, ça a l'air d'être un format interne AMD mais c'est sur ce site web, d'accord ? Bon on a ces deux URL, sashtrgmatx.bonner, sashtrgmatx.ri.rai.grammar.tx, on cherche un truc, essayons pragmatx.bonner.rai ? Non, 404. Rai.rai.rai. Oh bingo ! Donc ça c'est un bonner complet, une documentation du registre avec tous les champs du registre, avec toutes les adresses, c'est pas 100% spéciale, grande majorité. Donc ça on dirait que c'est du stuff interne AMD, j'ai cherché l'outil en ce site et apparemment il y a des travilles chez AMD. Donc oui, ça c'est vraiment vraiment utile parce que maintenant on sait ce que tout veut dire, qu'on peut débuguer les registres, etc. Donc il y a écrit un parser pour ce format. Donc c'est du XML assez. Il a écrit un parser de XML en pitant où on peut dumper et on peut voir chaque registre que ça veut dire. Donc on peut prendre un DOM des registres et puis le mapper sur les trucs documentés. On peut faire un DiffDump. C'est très utile pour les GPUs AMD et ça s'applique finalement à beaucoup de GPUs AMD parce que finalement c'est utile à tout ce qu'il essaie de faire du hacking AMD parce qu'il partage beaucoup de registres. Ok, donc on a quelques documentations, comment on arrive à un frame buffer. Donc, si tu le GPU, c'est HDMI. Donc si tu demandes l'information du GPU, tu vois qu'il importe HDMI. Mais si le HDMI, tu demandes le GPU, tu dis que le HDMI n'est pas connecté, le DisplayPort est connecté. Ok. Donc oui, ils ont un non-codeur XM pour le HDMI sur les GPUs sur HDMI. Donc Sony a un plein monde d'enchib qui convertit le protocole HDMI. Et donc voilà. Sony. Ok, donc c'est un DisplayPort Panasonic sur HDMI. Donc ça ne fonctionne pas même si les GPUs bridges fonctionnent. Dans le passé des cartes AMD ont utilisé ces bridges. Donc le code supporte de parler. C'est super. Et voici le protocole ICC. Donc le protocole ICC est un protocole RPC qui est utilisé pour envoyer des commandes au MCU System. C'est un système de message box. On écrit un message, location mémoire. Et écrit ça, il vous répond et dit, hey, voici la réponse. C'est accessé par Léolia. C'est utilisé pour des trucs style of bouton power, allumer tendre, les LED. Et aussi le système intégré qui gère leur codeur HDMI. Donc il faut encore coder un driver pour ça. Génial. Bon ok, c'est de l'ICC. Bon c'est simple. On lit un registre, on écrit un registre. On a besoin de ça. C'est tout. C'est simple. Ok. Non. Créons un moteur de script bytecode pour envoyer des commandes à I2C et utilisons ça partout. Mais pourquoi Sony ? Mais pourquoi Sony ? Parce que l'ICC c'est tellement slow, tellement long que si on essaie de faire une lecture, une écriture à la fois, ça prend deux secondes d'allumer le HDMI deux secondes. Ouais. Je sais vraiment plus. À ce stade, j'ai aucune idée. Et au passage, ce truc à des commandes où on peut envoyer des scripts à lancer quand certains événements se lancent. Donc on peut mettre des scripts dans les scripts pour faire du light ou c'est dans le I2C. Donc bon. Ok. Voilà. Ok. Donc on a du code pour ça. On a des haches. On a... Il y a plein de trucs qui sont cassés. Les tailles de curseurs bureau. Il nous faut quatre lignes CPU. Bon. Mais on a une console frame buffer. Bon. On a une architecture mémoire unifiée sur la PS4. On a un pool de mémoire qui est partagé entre l'X86 et le GPU. Et les jeux mettent un truc à tel endroit mémoire et disent un CPU. Hé ! Non. Rends-moi ça. Ça fait sens. C'est très pratique. Les drivers utilisent ça. Et du coup, les anciens GPU avaient une mémoire séparée. Et on peut émuler la VRAM en utilisation de la mémoire système. Et on a des PC qui font ça, c'est configurable dans le BIOS. Et la PS4 configure la VRAM émulée à 16 MB. Ce qui est pas assez pour avoir un seul frame buffer HDMI. Alors qu'il il faut quatre. Donc la solution c'est reconfigurer le contrôleur mémoire de la PS4 pour donner 1 GB de RAM en tant que VRAM dans le PS4 KX. Donc on fait des trucs du style de ce que ferraient un BIOS. On reconfigure le Northbridge. Bon. Ça marche. On a X qui démarre. C'est pratique. Il peut allouer son frame buffer. Ok. Donc maintenant, la 3D. L'accélération matérielle graphique. Ça fonctionne pas tout à fait. On a X11 mais... Ok. Parlons du DCPU radion pour un instant. Donc quand on veut dessiner un truc sur un GPU, on lui envoie une commande. On la passe dans un anneau, une structure en mémoire. Et ça tourne. On peut faire une queue de trucs à exécuter. Ça le fait... Voilà. Donc on a un anneau de graphique. On a un anneau compute pour le GPU. Et un anneau de DMU pour faire les copies mémoires. Les commandes sont traités par le commande processeur du GPU qui a en fait plusieurs CPU dans un GPU qui run du microcode AMD propriétaire. Donc c'est une sous-architecture. Donc les anneaux peuvent faire des appels dans des buffers indirects avec encore plus de commande. Et c'est comme ça qu'on fait les choses en user space. Puis dit, hey, dessine au kernel. Et le kernel dit, hey, jump là dedans et retourne. Et en gros, c'est comme ça que fonctionnent les GPU, mais particulièrement les radions avec ce F32. Donc le driver n'est pas content. Ring 0 test failed. Au moins, on a des diagnostics assez sympas. Le test fonctionne pas. Comment il marche ? Il met une valeur dans un registre et veuillez écrire à cet endroit cette valeur et vérifier si, bon, il y a bien l'écriture à fonctionner. Donc l'écriture ne se produit pas. Bon, par chance, on a trouvé les registres de debug. Merci Bonner.ri qui montre que le processeur de commande est coincé et qu'il a tant en fait des données dans l'anneau. Après, une commande nop. Bon, nop, c'est difficile. Donc maintenant, on va ralentir. Donc les paquets, les headers de paquet ont un champ de longueur de taille moins 2, donc un paquet de deux mots à une taille de zéro et AMD a rajouté un paquet de un mot avec une taille de moins un. Et tout le firmware ne supporte pas ça et pense que c'est un paquet de 3FFF, un paquet énorme. Donc il va attendre dans le buffer pour plein de codes. Il y a le même problème dans Hawaii, dans le CPU, dans les vieilles versions du microcode. Donc ils ont modifié le paquet nop, rajouté une exception dans le driver. Là, on s'est cogné la tête pendant beaucoup, beaucoup, beaucoup, beaucoup d'heures à ce stade. Mais bon, ok. Donc on a réparé, bam, RIMSuite Asphalt. C'est l'anneau SDMA pour copier des trucs dans la mémoire. Ça fonctionne pareil. Ça met une valeur en mémoire. Ça dit, hey, écris-moi ça et vérifiez. Et cette fois, on voit l'écriture MESS, ça écrit un zéro au lieu du deadbeef. Donc on va essayer ça. Si je mets deux commandes d'écriture, écris ici, écris ailleurs, et cette fois je vois ce qui fait, il écrit 1 à la première destination et 0 à la deuxième. Ok, ça devrait écrire deadbeef en principe. Donc ça écrit 1. Ok, il y a un 1 ici qui était pas avant, c'était un 0, c'était du padding. Bon, en fait, ils ont une erreur de off par 4, de décollage par 4 dans l'off-parceur, et ça lit quatre mots après de ce que ça devrait lire. Encore des heures à ce que vous dites la tête. On essaie des commandes oiseaux. Ça marche, pourquoi ? Donc ça lit quatre mots après, mais seulement dans les ring buffer, dans les buffer indirects, ça fonctionne bien. Bon, heureusement parce que ça vient de l'userspace. Bon, les trucs sont utilisés que dans le carnel, on peut écrire une autre commande file. Bon, comment ça fait que les gens fassent des erreurs pareilles ? Bref. Bon ça, on peut faire passer les tests gpu, mais maintenant on a des pages fault. Qu'est-ce qui se passe ? On ne peut pas écrire les registres de pages du gpu depuis des commandes internes du gpu. On peut les écrire depuis le CPI, une écriture mémoire registre, mais on ne peut pas dire au gpu en lui-même, et écrit-moi dans le registre des pages ici. Donc tout est cassé. Et FreeBSD utilise pas ça, par contre, les nukes l'utilisent. Il y a peut-être du firewall ou un truc qu'ils ont rajouté, un firewall d'un livre registre. On peut écrire directement que le cpu, mais c'est plus asynchronous, ça pourrait casser des trucs, c'est un acte vraiment dégueulasse. J'aimerais beaucoup réparer ça, et peut-être qu'il y a un firewall dans le firmware, mais qui est propriétaire à mon documenté. Donc en parlant du firmware, c'est du microcode qui n'est pas documenté pour le moment, mais on a pris les blobs de FreeBSD, c'est bien, on n'a pas les redistribuels, donc ça va. Et on peut creuser dedans. Donc comment est-ce qu'on fait de la générique interne sur une cpu architecture inconnue ? C'est simple, devinez ce que fait une instruction, essayez de la lancer, regardez ce que ça a fait, recommencez. Donc si on fait un firmware de deux instructions, qui fait deux trucs, qui est écrit un registre, c'est facile à faire, c'est facile à trouver dans le binaire, parce qu'on va voir ça, on va voir les offsets, on va les identifier facilement. Donc en gros, on a écrit un des assembleur pour le microcode GPU F32, donc registre armes. Ce n'est pas un complète, mais ça peut désembler toutes les instructions de tous les firmware de Liverpool pour le PFP, le ME, le CE, le MC et le RLC qui sont des blocs différents du GPU. Bon le firmware GPU c'était la magie du voodoo avant ça que personne connaissait, donc voilà on a un tool. Et on peut désassembler les CPU de PC aussi, c'est pratique pour débugger des problèmes des bus bizarres et pas seulement les trucs de la PS4. Ok, hélas, c'est pas d'un firmware, ça a l'air d'être bloqué au niveau matériel, j'ai trouvé un registre de débloqueage, je dis qu'il y a une violation d'accès au bus quand on essaie d'écrire ça, j'ai essayé de contourner de différentes manières, j'ai même acheté un système desktop APU AMD, j'ai fait des divs sur les registres entre les nus que ses fruits SD et essayé de mettre toutes les valeurs de l'un sur l'autre, on espère en trouver des noms magiques quand c'est comme ça, ils ont probablement réglé à ce qu'elles ne parlent. Bon, c'est des 0 et des 1, une mère de 1 et 2 0, beaucoup rage. Ça écrit sur le CPU. On peut faire de la trodée si on écrit avec le CPU, bon c'est dégueulasse, il y a des resconditions mais ça fonctionne. Donc la checklist, qu'est-ce qui marche, qu'est-ce qui marche pas ? Interruption, timer, pensérie, on peut éteindre le système, on peut rebouter, c'est drôle mais bon, on fait de la SIC, donc il y a du code sympa, voilà. Donc si j'ai implémenté ça, il y a quatre heures, parce que oui, la prise déconnée à force. Le bouton Power Function, USB Function, un truc drôle, c'est que ça ne marchait pas, on a dit qu'on allait réparer plus tard, c'est un cas spécial, et puis quelqu'un a poulé du USB Note 2 working et ça marche, donc apparemment on l'a réparé par accident. Le disque du refonctionne, le Blu-ray fonctionne, j'ai écrit un driver il y a deux-trois heures pour ça. J'ai passé 20 minutes à chercher quelqu'un dans l'accent A avec un DVD, donc ça devient difficile de trouver des DVD, mais ça fonctionne, donc c'est cool. Le Wi-Fi Bluetooth fonctionne, l'Eternet fonctionne, mais seulement en gigabit. Le framebuff fonctionne, l'HDMI fonctionne, mais c'est hard-coded en 1080p. On pourrait réparer ça en améliorant l'implémentation de l'encoder. La 3D fonctionne avec le hacky-monde au niveau d'ergis et la sortie audio-speddf fonctionne, c'est cool. La sortie audio-HDMI ne fonctionne pas, essentiellement parce que l'audio, j'ai commencé à le faire fonctionner de manière assez basique récemment et donc au niveau de l'encoder, c'est pas encore supporté. Et l'horloge temps réel n'est pas supporté et si vous pensez que c'est simple, ok. L'horloge, elle est simple, mais la manière dont Sony a implémenté la RTC dans la PS4 au lieu de lire et écrire dans l'horloge, ils écrivent jamais le temps dans l'horloge. Ils conservent des offsets dans un endroit bizarre par rapport à un gros bordel d'appel de registre sur la PS4. Je sais même pas où c'est, c'est ok, peut-être dans le disque. C'est trop compliqué de passer l'heure juste à la RTC, mais bon, on s'en fout. Et on a les blikon lights, c'est très important. Les lumières qui clignotent sous Linux, on peut faire des trucs marrons avec les LED. Donc c'est cool. Donc le code, vous pouvez chopper le code de PS4 KZ sur notre part GitHub. Il y a la configuration hardware, le code bootladder. Donc on a le fork du kernel PS4 Linux, rebasé sur la 4.9 qui est là pour une version appellaisante. On a trois petit patches au driver Raviron et les bibliothèques space utilisateurs pour supporter des patches. Ainsi que les outils FD32 DCRI que j'ai mentionné tout à l'heure. On peut te pourrer tout ça sur le ripos. Je les ai pushes juste avant. Donc si vous voulez aller chercher sur ce site web, dépêchez-vous de regarder avant qu'il enlève. Mais bon, il y a toujours l'Internet archive. Voilà l'histoire de comment est-ce qu'on a fait pour faire tourner Linux sur la PS4. Vous pouvez nous chopper sur ce site web ou fais le workflow sur Twitter. Merci. Donc j'espère que c'était pas trop rapide. Désolé, j'ai tendance à rocher un peu dans mes 89 slides parce que je voulais vraiment faire une démo. Et ensuite, c'est la démo. Mais on peut en fait essayer de faire quelque chose d'autre. Peut-être que j'arrive à être... Si je peux viser, si j'arrive à viser. Ok, c'est pas le bon bouton. C'est pas le bouton droit. Fermez. Ok. Donc on a cette petite icône ici. Qu'est-ce que ça fait si je clique ? On a accès à Internet. J'espère que le wifi fonctionne. Laissez-moi vérifier vite faire. Ça pourrait fonctionner assez mal si on n'a pas le wifi. Pink, 8, 8, 8, 8. Ok, c'est bon. On a le wifi. Ok. Qu'est-ce qui se passe si on clique la tueur ? Ça met un moment à charger. C'est pas optimisé. Donc les CPU sur ce truc sont assez lent, mais regardez. Ça fonctionne. Et maintenant c'est une vraie console 2. Et c'est... Ok, voilà, on y est. Donc oui, je pense qu'on peut faire des questions réponses parce que ça me met du temps à charger, mais on peut essayer un jeu. Donc si vous voulez des Q&A, je pense qu'il y aura des questions. Est-ce qu'on commence avec une question de l'Internet ? Testing, testing. L'Internet a envie de savoir si la plupart de votre charge va être publiée ou ceur. En principe, tous les codes et les applications que j'ai données, c'est ça mes recherches. Tout est sur le GitHub, tous les pilotes. Il y a aussi les specs du code. Si vous voulez, je peux écrire des pages de wiki là-dessus. Mais en gros, ce qui est sur le driver, c'est ce qu'on a trouvé. Le truc le plus intéressant, à mon avis, c'est toutes ces histoires de F32, du GBUMD. Mais si vous avez des questions générales ou vous voulez des détails que vous me posez, je ne sais pas trop. Ça pourrait être sympa de documenter tout, mais bon, c'est pas que je ne veux pas. Voilà, les ingénieurs apparaissent. Au moins, on a le code qui est plutôt clean sur GitHub. Donc, si vous avez des questions, allez sur les microphones, microphone 4. Deux faces. La première, c'est à qui il faut actuellement le faire. Le deuxième, c'est qu'il y a des trucs qui fonctionnent plutôt bien, mais d'autres qui sont un peu dégueulasses. Donc, il faut qu'on s'astalle, qu'on le fasse. Il y a plus part des histoires de X86 que Stom c'est faisable. Par contre, les hacks, au niveau des interruptions, c'est un peu dégueulasse. Donc, si vous avez une meilleure façon de le faire, des developers carnelles par ici. Bon, le truc de la Radeon, c'est inférieur au standard de qualité et de manière compréhensible. Les développeurs de Pilota MD qui travaillent pour MD aimeraient bien. Enfin, il se pourrait qu'ils ne souhaitent pas s'associer à ce projet pour des raisons compréhensibles. Mais bon, ils ne peuvent pas réellement nous stopper de streamer les trucs dans le prochain qui est noyau. Donc, si au bout d'un moment, si on a un code montrable, on le fera, mais c'est probable que les trucs non liés au GPU rentrent d'abord. Après, si vous voulez essayer d'upstreamer, allez-y, c'est open source. Ok, microphone 1. D'abord, je pense qu'il faudrait qu'il trouve Trevor Hudson et être forcé pour utiliser ton implementation de FreeBSD. Mais la vraie question est si la raison que Tachy est des Gen2, c'est parce que le système DSD est encore un de mes sacs à faire. Je fais tourner Gen2 sur ma machine principale, sur la plupart des machines que j'aime bien. Je aussi hache sur certaines machines. Je sais gérer système 2, mais j'aime beaucoup Gen2 parce que c'est léger. C'est facile d'utiliser des patchs. Pas besoin de tout cloner, choper les patchs des portages. C'est simple de patcher des package sur Gen2. C'est une des raisons principales pour laquelle j'utilise Gen2. Numéro 3. Est-ce qu'il y aura des nouveaux exploits, des nouvelles façons de bouter linux sur une PS4 ? Parce que trouver l'ancien formoir c'est assez rare. C'était 504. Notre but c'est de se focaliser sur... J'ai donné l'histoire sur les exploits. Notre but c'est de se focaliser sur notre truc linux. La raison qu'on n'a pas envie de publier notre exploit ou qu'on n'a pas envie de s'enlever dans la scène des exploits c'est que c'est pas très compliqué. C'est pas du code vraiment... C'est pas très dur de faire ça sur du BSD. On sait que plusieurs personnes ont reproduit sur différents formoirs donc il n'y a pas besoin que ce soit nous qui vous donnons les exploits. On n'a pas envie que ça donne lieu à plein de conférences. Faites-le vous-même pour cette fois. Et qu'est-ce que dit l'Internet ? L'Internet a envie de savoir si vous avez amusé avec le BSD sur le deuxième processeur. C'est une très bonne question et moi-même je n'ai pas testé. Je crois que quelqu'un d'autre a regardé ça brièvement. Une des commandes pour reboutter va boutter ce CPU-là sous FreeBSD et il y a probablement des trucs rigolo à faire mais on n'a pas vraiment creusé. Et le micro-5. Je me demandais s'il y a quelque chose qui s'appliquerait sur la PS4. Ah oui, Sony a sorti une nouvelle PS4. La PS4 Pro ? Oui, donc Linux boot sur la Pro. On est allé aussi loin par contre le GPU est cassé donc on aimerait que ce soit supporté et que ça fonctionne sur la Pro. Donc il y a des mises à jour incrementielles, c'est pas si dur que ça mais il faut redéfinir des trucs au niveau du GPU. Et vous avez trouvé des amis. Donc la 3D fonctionne, vous pouvez voir. Regardez en haut et en bas. Dans ce jeu, il faut faire ça. Numéro 3. J'aimerais demander si vous avez envie de porter ça, c'est pas être sur Radeon, pour le nouveau GPU AMD, parce que AMD supporte maintenant les sauvages d'un GPU. C'est une très bonne question en fait. La première tentative qu'on a faite pour les drivers AMD, ça ne fonctionnait pas du tout à ce moment-là. Là, la fraîcheur du driver était, le driver était pas frais, le support était expérimental, donc ça pourrait marcher, ça pourrait marcher. À partir du moment où on aura une implementation nettoyée qui fonctionne mieux, on va réessayer les GPU AMD, on verra si ça fonctionne, parce que les GPU de nouvelle génération ont besoin de ce genre de choses. Nouvelle question d'Internet ? Internet se demande si, au dit qu'il y a une année, tu as discuté sur Twitter avec quelqu'un que la PS4 n'était pas un PC et maintenant tu dis que la PS4 est comme un PC, donc est-ce qu'il y a quelque chose qui a changé ? Encore une fois, la raison de dire que c'est pas un PC, c'est que c'est pas un compatible IBM PC, c'est un appareil X86 qui est structuré à peu près comme un PC, mais si on regarde les détails, il y a beaucoup de choses qui sont complètement différentes. Ça se comporte comme un PC, mais on peut définir une subarche. C'est un X86, mais c'est pas un PC, c'est une distinction très importante. Il y a plein de trucs que vous avez jamais entendu parler qui sont de l'X86, mais pas du PC. Il y a des chances que votre écran télé à la maison et un X86 à l'intérieur. Il n'y a plus personne au micro, une dernière question d'Internet. Oui, il y en a une. La question est... Si il y avait besoin de description... Non, pas de description nécessaire. Non, les exploits webkit, on a user mode, exploit kernel mode. Il n'y a rien qui vous empêche de faire tout ça. Il y a une sandbox FreeBSD, mais on la contourne. Il n'y a pas d'hypervisor, il n'y a pas de monitoring. Il n'y a rien qui dit, ce code devrait pas tourner. Il n'y a pas de contrôle d'intégrité. Ils ont une architecture de sécurité, mais c'est un truc Sony qu'on peut totalement contourner. La PS3 était notable pour le fait que le jailbreak USB, un appareil de piratage USB que quelqu'un a sorti, qui utilise des exploits USB dans le kernel, et rien que ça pour rendre possible le piratage. On a toute une pile de sécurité, on casse juste un truc, et bam, piratage, ça c'est un gros fail. Sony, c'est pas comment faire des architectures sécurisées. Ça y est, ça y est, c'est bon ? Merci beaucoup, les applaudissements.