Microcode

Suite à ce bug https://youtrack.jetbrains.com/issue/JBR-2310 qui provoquait des crash violents du système en utilisant un IDE jetbrains, voici un moyen pour ajouter un microcode à l'initrd.

Sur https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files/issues/39 le mainteneur indique que le microcode 150 est dispo sur https://github.com/platomav/CPUMicrocodes/blob/master/Intel/cpu706E5_plat80_ver00000096_2020-06-16_PRD_4A457385.bin, mais ensuite on en fait quoi ?

Je l'ai mis dans /boot, ma seule partition non chiffrée, et en lisant une doc intel je vois qu'ajouter une ligne dans la conf grub devrait permettre de le charger avant l'initrd, j'essaie avec

      linux   /vmlinuz-5.7.0-0.bpo.2-amd64 root=/dev/mapper/nvme-root ro  quiet
      initrd  /cpu706E5_plat80_ver00000096_2020-06-16_PRD_4A457385.bin
      initrd  /initrd.img-5.7.0-0.bpo.2-amd64

mais ça marche pas… (le /cpu… désigne bien /boot/cpu…) probablement un pb du format du fichier.

Voici une méthode pour l'ajouter à l'init rd qui a fonctionné chez moi, mais attention, ne pas copier / coller ça sans bien comprendre ce que ça fait ! Et assurez-vous d'avoir un autre moyen de démarrer si cette procédure cassait le boot de votre machine.

# On regarde les microcodes installés
/usr/sbin/iucode_tool -tb -lS /lib/firmware/intel-ucode/* /boot/cpu706E5_plat80_ver00000096_2020-06-16_PRD_4A457385.bin 
/usr/sbin/iucode_tool: system has processor(s) with signature 0x000706e5
[]
selected microcodes:
  059/001: sig 0x000706e5, pf_mask 0x80, 2020-03-12, rev 0x0078, size 107520
 
# ok, 78 c'est bien celui qu'on a déjà, cf `grep microcode /proc/cpuinfo`
# on regarde s'il détecte le 150 (0x96) dans le .bin qu'on a téléchargé
/usr/sbin/iucode_tool -tb -lS /lib/firmware/intel-ucode/* /boot/cpu706E5_plat80_ver00000096_2020-06-16_PRD_4A457385.bin 
/usr/sbin/iucode_tool: system has processor(s) with signature 0x000706e5
[]
selected microcodes:
  082/001: sig 0x000706e5, pf_mask 0x80, 2020-06-16, rev 0x0096, size 108544
 
# il est bien sélectionné par défaut (0x0096 => 9×16+6 = 150), on l'ajoute à la liste de /lib/firmware/intel-ucode
iucode-tool -v --write-firmware /boot/cpu706E5_plat80_ver00000096_2020-06-16_PRD_4A457385.bin
iucode-tool: processed 1 valid microcode(s), 1 signature(s), 1 unique signature(s)
iucode-tool: selected 1 microcode(s), 1 signature(s)
iucode-tool: Writing microcode firmware file(s) into /lib/firmware/intel-ucode
iucode-tool: 06-7e-05: cannot write to, or create file: File exists
iucode-tool: no files were written into /lib/firmware/intel-ucode
 
# le fichier 06-7e-05 existait déjà, on le renomme avec les conventions dpkg mais un autre nom marcherait aussi)
mv /lib/firmware/intel-ucode/06-7e-05 /lib/firmware/intel-ucode/06-7e-05.dpkg-dist
 
# on recommence
iucode-tool -v --write-firmware /boot/cpu706E5_plat80_ver00000096_2020-06-16_PRD_4A457385.bin
iucode-tool: processed 1 valid microcode(s), 1 signature(s), 1 unique signature(s)
iucode-tool: selected 1 microcode(s), 1 signature(s)
iucode-tool: Writing microcode firmware file(s) into /lib/firmware/intel-ucode
iucode-tool: 06-7e-05: 1 microcode entries written, 108544 bytes
iucode-tool: 1 file(s) were written into /lib/firmware/intel-ucode
 
# ok, on vérifie qu'il serait bien sélectionné
/usr/sbin/iucode_tool -tb -lS /lib/firmware/intel-ucode/*
[]
selected microcodes:
  059/001: sig 0x000706e5, pf_mask 0x80, 2020-06-16, rev 0x0096, size 108544
 
# c'est tout bon, reste à l'inclure dans l'initrd
update-initramfs -u

Et après un reboot, `grep microcode /proc/cpuinfo` sort bien `0x96`.