Actualizando el Microcode de Intel

FreeBSD

[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).

informatica/unix_freebsd/fbsd-ucode.txt · Última modificación: 2020/07/13 21:11 por 127.0.0.1
Recent changes RSS feed Creative Commons License Donate Minima Template by Wikidesign Driven by DokuWiki