Dans cet article nous verrons comment modifier certains BIOS Award pour ajouter ou mettre à jour un microcode de processeur non compressé.
Attention, faire ceci peut être dommageable et empêcher le démarrage de votre ordinateur, il est conseillé de pouvoir reflasher le bios grâce à un programmateur externe, par exemple mon programmateur de SPI.

Pour commencer nous allons récupérer les microcode Intel puis les mettre sous une forme compréhensible par le bios, pour cela il faut se rendre sur le site http://downloadcenter.intel.com/, dans mon cas j’ai sélectionné Processors=>Desktop=>Intel Core 2 Quad Processor puis le microcode Linux* Processor Microcode Data File
J’ai ensuite récupéré un petit logiciel permettant de transformer ce fichier, il est disponible ici.

Il vous suffit de le compiler puis de le lancer avec comme paramètre le fichier de microcode précédemment téléchargé, vous aurez ainsi tous les fichiers sous la forme voulue.

Celui qui m’intéresse pour mon Q9400 est cpu0001067a_plat00000011_ver00000a0b_date20100928.bin.

J’ouvre maintenant mon fichier bios.bin avec ghex2 et recherche *ALIN16* pour trouver la longueur totale des microcodes dans mon bios qui est 00B00100 donc en hexa 0x0001B000

Pour trouver l’emplacement du premier microcode il suffit de prendre l’adresse d’*ALIN16* moins la longueur, cela nous donne :
0x1EDFE00x1B000 = 0x1D2FE0

Vue que mon microdode a une taille de 8192 octet, en hexa ça nous fait 0x2000, je vais donc insérer le mien à 0x1D0FE0, après avoir vérifié qu’il n’y a rien (à part une suite de 0xFF), pour cela j’utilise la commande dd :

Pour simplifier la suite je convertis les données hexa en décimale :
0x1D0FE0 = 1904608
0x1D2FE0 = 1912800
0X1EDFE0 = 2023392
0x1B000 = 110592

J’extrais ensuite les microcodes du bios :
$ dd if=bios.bin of=NCPUCODE.bin ibs=1 skip=1912800 count=110592
Puis je rajoute le mien au début :
$ cat cpu0001067a_plat00000011_ver00000a0b_date20100928.bin >NCPUCODE.tempo.bin
$ cat NCPUCODE.bin>>NCPUCODE.tempo.bin
$ mv NCPUCODE.tempo.bin NCPUCODE.bin

Je calcule donc le nombre de bits du bios à copier pour insérer le microcode modifié dans le bios :
1912800−8192=1904608
Je copie le bios avant microcode dans un fichier debut.bios.bin
$ dd if=bios.bin of=debut.bios.bin ibs=1 count=1904608
Et la fin après le microcode dans fin.bios.bin
$ dd if=bios.bin of=fin.bios.bin ibs=1 skip=2023392
Je recopie enfin le tout dans un nouveau fichier bios bios.mod.bin
$ cat debut.bios.bin > bios.mod.bin
$ cat NCPUCODE.bin >> bios.mod.bin
$ cat fin.bios.bin >> bios.mod.bin

Il faut ensuite changer la taille du microcode au niveau de la chaine *ALIN16* où nous l’avions trouvé tout à l’heure(cf image précédente), dans mon cas en remplaçant 00B00100 par 00D00100 qui est l’ancienne chaine plus 0x2000 qui est la taille du microcode rajouté, j’ai aussi modifié l’emplacement du début du microcode en recherchant la chaine *BS1 pour trouver 0E2F qui correspond à 0x1D2FE0, que je remplace par 0E0F toujours grâce à la longueur du microcode(cf image).

Voilà vous avez un bios modifié, mais pas encore flashable car il faut modifier le checksum, pour cela je vais utiliser l’outil CBROM32_198.EXE avec wine :

$ wine ./CBROM32_198.EXE bios.mod.bin /NC_CPUCODE NCPUCODE.BIN

Ça y est, le bios est modifié et prêt à être flashé pour faire la mise à jour.