Actualizando el Microcode de Intel
[Update Intel Microcode on FreeBSD](https://www.thomas-krenn.com/en/wiki/Update_Intel_Microcode_on_FreeBSD)
FreeBSD proporciona soporte para actualizar el microcódigo de un procesador al inicio o en tiempo de ejecución. En este artículo, utilizamos un servidor que ejecuta FreeBSD 12.1 para mostrar cómo verificar la versión del Microcódigo Intel y cómo instalar versiones más recientes del microcódigo si es necesario.
## Ejemplos de Configuración
En este ejemplo usamos la siguiente configuración:
* Servidor que utiliza una placa base ASUS P9D-MV con BIOS versión 2101 y una CPU Intel Celeron G1820T * FreeBSD 12.0
El ejemplo se llevó a cabo el 16.01.2019 con las versiones más actuales de BIOS, microcódigo y software disponibles en ese momento. Muestra claramente cómo se pueden instalar las últimas actualizaciones de seguridad en entornos críticos para la seguridad, tanto en términos de microcódigo como de actualizaciones de software.
## Leer la versión actual del microcódigo
La información sobre la CPU (nombre, CPUID, versión de microcódigo) se puede consultar con la herramienta x86info después de cargar el módulo cpuctl:
kldstat cpuctql
En la salida, la versión del microcódigo de la línea muestra la versión (en el ejemplo 0x000000000000000026), el CPUID se puede encontrar en la segunda línea en la salida eax (en el ejemplo 00040651):
# pkg install x86info # x86info -a x86info v1.31pre Found 4 identical CPUs Extended Family: 0 Extended Model: 4 Family: 6 Model: 69 Stepping: 1 Type: 0 (Original OEM) CPU Model (x86info's best guess): Core i7 (Haswell ULT) Processor name string (BIOS programmed): Intel(R) Core(TM) i5-4250U CPU @ 1.30GHz Performance msrs: MSR_IA32_PERF_STATUS: 0x1b6a00001700 MSR_IA32_MISC_ENABLE: 0x850089 [Enabled: TCC PerfMon EnhancedSpeedStep ] Thermal msrs: MSR_PM_THERM2_CTL: 0x0 [Thermal monitor: 1] MSR_IA32_THERM_CONTROL: 0x0 [Software-controlled clock disabled (full speed)] MSR_IA32_THERM_STATUS: 0x88370800 [......] Microcode version: 0x0000000000000026 eax in: 0x00000000, eax = 0000000d ebx = 756e6547 ecx = 6c65746e edx = 49656e69 eax in: 0x00000001, eax = 00040651 ebx = 00100800 ecx = 7ffafbbf edx = bfebfbff
Intel proporciona información sobre las versiones de microcódigo disponibles en el documento *Guía de actualización de microcódigo* (consulte [Microcódigo de Intel - Versiones de microcódigo](https://www.thomas-krenn.com/en/wikiEN/index.php?title=Intel_Microcode&action=edit&redlink=1)). Este documento enumera las CPU por su CPUID.
Al buscar `40651` en el documento Guía de actualización de microcódigo del 16.01.2019, la columna Nueva producción MCU Rev contiene la versión de microcódigo 0x26. En este caso, Intel proporciona una versión de microcódigo más nueva que la que está actualmente disponible a través del BIOS en el sistema de ejemplo.
## Variante 1: Actualización a través de devcpu-data El port `devcpu-data` contiene actualizaciones de microcódigo de CPU Intel y AMD (archivos binarios). Los microcódigos de `devcpu-data` se importan a la CPU a través de `cpuctl(4)/cpucontrol(8)`. Para que la actualización del microcódigo se realice automáticamente durante el proceso de inicio, las entradas `cpu_microcode_load` y `cpu_microcode_name` deben agregarse a `/boot/loader.conf`.
Para instalar las actualizaciones de microcódigo automáticamente en el futuro, instale el paquete `devcpu-data` e ingrese ambas opciones en `/boot/loader.conf`:
# pkg install devcpu-data # vi /boot/loader.conf # cat /boot/loader.conf cpu_microcode_load="YES" cpu_microcode_name="/boot/firmware/intel-ucode.bin" # reboot
Después del reinicio, el nuevo `microcode` que está en uso es:
# x86info -a | grep -i microcode Microcode version: 0x0000000000000026
## Variante 2: actualización a través de cpupdate Además de la variante descrita anteriormente, otro port para actualizar el microcódigo ha estado disponible desde 2018: `sysutils/cpupdate`. Esto fue desarrollado por Stefan Blachmann como una alternativa a `devcpu-data` para evitar errores y limitaciones de `devcpu-data`. La nueva herramienta `cpupdate` ofrece funciones adicionales, por ejemplo la simple consulta del actual versión del microcódigo, a través de `cpupdate -i`.
El desarrollador recomienda que compile la herramienta usted mismo.
Como una actualización desde ports autocompilados es difícil, el #Variant 1
La instalación de `cpupdate` en un sistema de prueba se puede hacer de la siguiente manera:
# portsnap auto cd /usr/ports/sysutils/cpudate # make install clean
Una vez que se ha compilado, instalado y hemos limpiado de archivos de compilación podremos utilizar esta herramienta en forma nativa en nuestra maquina.
La actualización del microcódigo en tiempo de ejecución tiene el siguiente aspecto en el sistema de ejemplo:
# cpupdate -i Found CPU(s) from Intel Core 0 to 3: CPUID: 40651 Fam 06 Mod 45 Step 01 Flag 40 uCode 00000026
Para actualizar automáticamente el microcódigo al inicio, se requieren los siguientes pasos:
Agregue en el /boot/loader.conf cpuctl_load="YES" Agregue en el /etc/rc.conf cpupdate_enable="YES"
Después de reiniciar, `cpupdate` muestra la nueva versión de microcódigo 0x26 en el sistema de ejemplo:
cpupdate -i Found CPU(s) from Intel Core 0 to 3: CPUID: 40651 Fam 06 Mod 45 Step 01 Flag 40 uCode 00000026
## Las diferencias Al probar las dos variantes el 16-01-2018, se hizo evidente que el microcódigo de #Variant 1: Actualización a través de `devcpu-data` se carga muy temprano durante el proceso de arranque. Ya en la primera inicialización de la CPU, se reconocen las cuatro características ampliadas estructuradas3 (IBPB, STIBP, L1DFL, SSBD), que son proporcionadas por la versión de microcódigo 0x26. Aquí está el extracto de la salida dmesg:
Copyright (c) 1992-2019 The FreeBSD Project. Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD is a registered trademark of The FreeBSD Foundation. FreeBSD 12.1-RELEASE-p7 GENERIC amd64 FreeBSD clang version 8.0.1 (tags/RELEASE_801/final 366581) (based on LLVM 8.0.1) VT(efifb): resolution 1600x900 module_register: cannot register mmc/mmcsd from kernel; already loaded from mmcsd.ko Module mmc/mmcsd failed to register: 17 CPU: Intel(R) Core(TM) i5-4250U CPU @ 1.30GHz (1895.66-MHz K8-class CPU) Origin="GenuineIntel" Id=0x40651 Family=0x6 Model=0x45 Stepping=1 Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE> Features2=0x7ffafbbf<SSE3,PCLMULQDQ,DTES64,MON,DS_CPL,VMX,EST,TM2,SSSE3,SDBG,FMA,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,x2APIC,MOVBE,POPCNT,TSCDLT,AE SNI,XSAVE,OSXSAVE,AVX,F16C,RDRAND> AMD Features=0x2c100800<SYSCALL,NX,Page1GB,RDTSCP,LM> AMD Features2=0x21<LAHF,ABM> Structured Extended Features=0x27ab<FSGSBASE,TSCADJ,BMI1,AVX2,SMEP,BMI2,ERMS,INVPCID,NFPUSG> Structured Extended Features3=0x9c000600<MD_CLEAR,IBPB,STIBP,L1DFL,SSBD> XSAVE Features=0x1<XSAVEOPT> VT-x: PAT,HLT,MTF,PAUSE,EPT,UG,VPID TSC: P-state invariant, performance statistics real memory = 12884901888 (12288 MB) avail memory = 11344838656 (10819 MB) CPU microcode: updated from 0x1c to 0x26
Con el Variant-2: Actualización a través de `cpupdate`, dos de las cuatro características ampliadas estructuradas 3 faltan al principio, por lo tanto, la versión más antigua del Microcódigo 0x24 todavía está en uso al principio. Esto se puede ver a través de dmesg:
Copyright (c) 1992-2019 The FreeBSD Project. [...] CPU: Intel(R) Core(TM) i5-4250U CPU @ 1.30GHz (1895.66-MHz K8-class CPU) Origin="GenuineIntel" Id=0x40651 Family=0x6 Model=0x45 Stepping=1 [...] Structured Extended Features3=0x9c000600<MD_CLEAR,IBPB,STIBP,L1DFL,SSBD> [...] real memory = 12884901888 (12288 MB) [...] Trying to mount root from ufs:/dev/ada0p2 [rw]... CPU: Intel(R) Core(TM) i5-4250U CPU @ 1.30GHz (1895.66-MHz K8-class CPU) CPU: Intel(R) Core(TM) i5-4250U CPU @ 1.30GHz (1895.66-MHz K8-class CPU) CPU: Intel(R) Core(TM) i5-4250U CPU @ 1.30GHz (1895.65-MHz K8-class CPU) CPU microcode: updated from 0x1c to 0x26 [...] Structured Extended Features3=0x9c000600<MD_CLEAR,IBPB,STIBP,L1DFL,SSBD>
Con Variant-2: Actualización a través de cpupdate, también es posible cargar el microcódigo al principio. Sin embargo, el archivo de microcódigo exacto de la CPU debe aparecer en la lista. En el sistema de ejemplo, esto es posible mediante la siguiente entrada en `/boot/loader.conf`:
cpu_microcode_load = "YES" cpu_microcode_name = "/usr/local/share/cpupdate/CPUMicrocodes/primary/Intel/06-3c-03"
## Referencias
1. [Introduccion cpupdate, una herramienta de microcodigo para FreeBSD](https://forums.freebsd.org/threads/introducing-cpupdate-a-microcode-tool-for-freebsd.64588/). 2. [cpupdate](https://github.com/kernschmelze/cpupdate). 3. [Bug-192487 - cpucontrol uses unsafe procedure to detect current microcode version](https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=192487). 4. [cpupdate manpage draft](http://bsd.denkverbot.info/2018/03/cpupdate-manpage-suggestion.html). 5. No instale a travez de pkg, instale a travez de ports, [cpupdate](https://github.com/kernschmelze/cpupdate). 6. [Absolute FreeBSD 3rd Edition](https://nostarch.com/absfreebsd3) 7. [D16370: Implement early microcode loading for Intel i386 and amd64 platforms](https://reviews.freebsd.org/D16370?id=45663). 8. [Introducing cpupdate, a microcode tool for FreeBSD - comment #16](https://forums.freebsd.org/threads/introducing-cpupdate-a-microcode-tool-for-freebsd.64588/#post-413778).