Fenghua Yu | 0d91ea8 | 2012-12-20 23:44:21 -0800 | [diff] [blame] | 1 | Early load microcode |
| 2 | ==================== |
| 3 | By Fenghua Yu <fenghua.yu@intel.com> |
| 4 | |
| 5 | Kernel can update microcode in early phase of boot time. Loading microcode early |
| 6 | can fix CPU issues before they are observed during kernel boot time. |
| 7 | |
| 8 | Microcode is stored in an initrd file. The microcode is read from the initrd |
| 9 | file and loaded to CPUs during boot time. |
| 10 | |
| 11 | The format of the combined initrd image is microcode in cpio format followed by |
| 12 | the initrd image (maybe compressed). Kernel parses the combined initrd image |
| 13 | during boot time. The microcode file in cpio name space is: |
Jacob Shin | 757885e | 2013-05-30 14:09:19 -0500 | [diff] [blame] | 14 | on Intel: kernel/x86/microcode/GenuineIntel.bin |
| 15 | on AMD : kernel/x86/microcode/AuthenticAMD.bin |
Fenghua Yu | 0d91ea8 | 2012-12-20 23:44:21 -0800 | [diff] [blame] | 16 | |
| 17 | During BSP boot (before SMP starts), if the kernel finds the microcode file in |
| 18 | the initrd file, it parses the microcode and saves matching microcode in memory. |
| 19 | If matching microcode is found, it will be uploaded in BSP and later on in all |
| 20 | APs. |
| 21 | |
| 22 | The cached microcode patch is applied when CPUs resume from a sleep state. |
| 23 | |
| 24 | There are two legacy user space interfaces to load microcode, either through |
| 25 | /dev/cpu/microcode or through /sys/devices/system/cpu/microcode/reload file |
| 26 | in sysfs. |
| 27 | |
| 28 | In addition to these two legacy methods, the early loading method described |
| 29 | here is the third method with which microcode can be uploaded to a system's |
| 30 | CPUs. |
| 31 | |
| 32 | The following example script shows how to generate a new combined initrd file in |
| 33 | /boot/initrd-3.5.0.ucode.img with original microcode microcode.bin and |
| 34 | original initrd image /boot/initrd-3.5.0.img. |
| 35 | |
| 36 | mkdir initrd |
| 37 | cd initrd |
Jacob Shin | 757885e | 2013-05-30 14:09:19 -0500 | [diff] [blame] | 38 | mkdir -p kernel/x86/microcode |
| 39 | cp ../microcode.bin kernel/x86/microcode/GenuineIntel.bin (or AuthenticAMD.bin) |
| 40 | find . | cpio -o -H newc >../ucode.cpio |
Fenghua Yu | 0d91ea8 | 2012-12-20 23:44:21 -0800 | [diff] [blame] | 41 | cd .. |
| 42 | cat ucode.cpio /boot/initrd-3.5.0.img >/boot/initrd-3.5.0.ucode.img |
Borislav Petkov | b584303 | 2016-02-03 12:33:45 +0100 | [diff] [blame] | 43 | |
| 44 | Builtin microcode |
| 45 | ================= |
| 46 | |
| 47 | We can also load builtin microcode supplied through the regular firmware |
Borislav Petkov | 9f3cc2a | 2016-06-06 17:10:50 +0200 | [diff] [blame] | 48 | builtin method CONFIG_FIRMWARE_IN_KERNEL. Only 64-bit is currently |
| 49 | supported. |
| 50 | |
| 51 | Here's an example: |
Borislav Petkov | b584303 | 2016-02-03 12:33:45 +0100 | [diff] [blame] | 52 | |
| 53 | CONFIG_FIRMWARE_IN_KERNEL=y |
| 54 | CONFIG_EXTRA_FIRMWARE="intel-ucode/06-3a-09 amd-ucode/microcode_amd_fam15h.bin" |
| 55 | CONFIG_EXTRA_FIRMWARE_DIR="/lib/firmware" |
| 56 | |
| 57 | This basically means, you have the following tree structure locally: |
| 58 | |
| 59 | /lib/firmware/ |
| 60 | |-- amd-ucode |
| 61 | ... |
| 62 | | |-- microcode_amd_fam15h.bin |
| 63 | ... |
| 64 | |-- intel-ucode |
| 65 | ... |
| 66 | | |-- 06-3a-09 |
| 67 | ... |
| 68 | |
| 69 | so that the build system can find those files and integrate them into |
| 70 | the final kernel image. The early loader finds them and applies them. |