Forcer le flash du SMC en aveugle

J’avais déjà parlé de mon prototype de MacBook Pro et de son SMC qui n’était pas équipé du bon firmware. Après avoir fait mon gros boulet (je vais m’expliquer), j’ai du trouver un moyen de flasher en aveugle (et pas avec la bonne version…) et j’ai réussi. Petit récit.

J’ai un prototype de MacBook Pro 2011 qui était équipé d’une version bêta du firmware du SMC (le composant qui gère notamment les ventilateurs). J’avais bien essayé d’installer une version récente à travers les mises à jour officielles, mais (évidemment), ça ne fonctionnait pas : le logiciel détecte que la version n’est pas la bonne et n’accepte pas.

L’idée a donc été de forcer le flash, ce qu’il est souvent possible de faire. Manuellement, pas besoin d’y penser : la puce SMC est une puce BGA, donc inaccessible avec des outils classiques (au contraire de la mémoire qui contient l’EFI). J’ai donc installé rEFIt et suivi les instructions qui sont là.

En gros, on extrait le firmware du package Apple, on le place sur une clé USB, on démarre sur un shell EFI et on force le flash. Sans être simple, c’est accessible comme méthode. Mais comme un (énorme) boulet, je me suis planté de firmware : j’ai pris celui d’un MacBook Pro 2010. Et comme les fichiers Apple sont mal faits, je n’ai pas remarqué l’erreur : même pour le 2011, le fichier s’appelle « 2010 ».

Les fichiers de la mise à jour SMC d'un MacBook Pro 2011

Les fichiers de la mise à jour SMC d’un MacBook Pro 2011

Bon, du coup, la machine n’a évidemment pas apprécié. Le Mac s’allumait, mais sans image, avec les ventilateurs à fond. j’ai d’abord pensé qu’il était complètement mort, avant de me rendre compte que le disque dur faisait des accès au démarrage. En cherchant un peu, je me suis rendu compte que la machine était accessible depuis le réseau et — après avoir activé les fonctions en démontant le disque et en démarrant depuis une autre machine — j’ai activé la prise en main à distance. Conclusion : la machine fonctionnait, mais sans carte vidéo. C’est un problème : le contrôle depuis le réseau était horriblement lent et impossible de mettre à jour le SMC facilement.

J’ai d’abord essayé de flasher en aveugle en réinstallant rEFIt et en faisant les manipulations de démarrage en aveugle, mais impossible : sans aucun retour, passer manuellement sur le shell n’a pas fonctionné. J’ai donc essayé de trouver comment automatiser le tout.

Première étape : faire un script de démarrage. rEFIt peut charger un script (startup.nsh) au démarrage. Il faut aller le placer manuellement dans la partie du disque dur qui contient quelques fichiers.

mkdir /Volumes/EFI
sudo mount -t msdos /dev/disk0s1 /Volumes/EFI

Ensuite, on ajouter le fichier startup.nsh à la racine en mettant les trucs à faire. Attention au backslash (alt + shift + :) et attention au nom du disque dur. fs0 est la partition EFI, fs1, la première partition du disque dur, etc.

fs1:\SmcFlasher.efi -reset 1
fs1:\SmcFlasher.efi -force -LoadApp 2011MBP15.smc
reset

Ensuite, il faut forcer le démarrage sur le shell. Le mieux que j’ai trouvé, c’est de limiter le timeout dans le fichier refit.conf (0 au lieu de 20) et de forcer le shell comme valeur par défaut, avec la ligne suivante :default_selection S.

Après quelques essais avec une clé USB puis en passant sur le disque dur, ça a fonctionné : je démarre le Mac, j’attends un peu pour être certain qu’il est sur le menu de rEFIt, je presse Enter pour lancer le shell et j’attends. Miracle, après quelques minutes, les ventilateurs se taisent et la machine démarre. J’ai réussi.

Bon, ça n’a pas réglé totalement mon problème : impossible de démarrer Yosemite, le GPU (lié au processeur ES de la machine) pose des soucis, mais j’ai réussi. Au passage, ça paraît simple une fois résumé, mais j’ai tout de même passé trois grosses soirées (on peut même parler d’une bonne partie de la nuit) sur le sujet avant de trouver une idée et de la mettre en oeuvre.