Subject: Syslinux & Xen & microcode updates

From: Christian Kujau <[email-masked]>
Date: Mon, 21 Oct 2019 03:19:15 -0700 (PDT)

Hello,

I'm having trouble applying CPU microcode updates to this system running a 
Xen dom0. Lots of internet resources appear to recommend to add 
"ucode=early_ucode.cpio" to the EFI xen.cfg configuration file and it will 
magically work, but even though EFI support is now available[0], this 
system of mine is using Syslinux to boot:

 LABEL xen-vanilla
   MENU LABEL Xen + Linux vanilla
   COM32 mboot.c32
   APPEND xen.gz dom0_mem=512M,max:1024M ucode=scan --- vmlinuz-vanilla \
     root=[...] modules=ext4 --- initramfs-vanilla

"xl dmesg" sees that command line, but nothing gets loaded:

======================================================================
# xl dmesg | grep -i code
(XEN) Command line: dom0_mem=512M,max:1024M ucode=scan

# dmesg | grep -i micro
[    0.602101] MDS: Vulnerable: Clear CPU buffers attempted, no microcode
======================================================================

Hm. So, the intel-ucode package installed a file called 
/boot/intel-ucode.img, where a single file 
kernel/x86/microcode/GenuineIntel.bin is stored. Specifying 
"ucode=intel-ucode.img" or "ucode=GenuineIntel.bin" (after extracting it) 
only confused the microcode loader:

======================================================================
$ sudo xl dmesg | grep intel
(XEN) parameter "ucode" has invalid value "intel-ucode.img", rc=-22!
======================================================================

I even tried to re-generate the microcode package from the firmware files:

  $ iucode_tool -v -S --write-earlyfw=/boot/early_ucode.cpio /lib/firmware/intel-ucode/[0-9]*

But passing this early_ucode.cpio to "ucode=" didn't work either, same 
error as above.

This Arch Linux posting[2] ("Advice: Where to capture custom Microcode 
system requirements/setup?") looked promising, but did not work for me 
(see above), maybe because I don't have an EFI system here. As mentioned 
there, according to the kernel documentation[1], the microcode can just be 
added to the standard initrd - tried that, but nothing happened.

Also, combining microcode+intrd on the Syslinux command line[3] didn't 
work either:

  [...]
  APPEND xen.gz dom0_mem=512M,max:1024M ucode=scan --- vmlinuz-vanilla 
      root=[...] early_ucode.cpio,initramfs-vanilla

Booting this failed with:

   Loading xen.gz.... ok
   Loading vmlinuz-vanilla... ok
   Loading early_ucode.cpio,initramfs-vanilla... failed!
   No files found!

Anybody got any ideas how to proceed here?

Thanks,
Christian.

[0] https://wiki.alpinelinux.org/wiki/Alpine_and_UEFI
[1] https://www.kernel.org/doc/html/latest/x86/microcode.html
[2] https://bbs.archlinux.org/viewtopic.php?pid=1814472#p1814472
[3] https://wiki.gentoo.org/wiki/Intel_microcode#Syslinux
-- 
BOFH excuse #200:

The monitor needs another box of pixels.