Re: [PATCH 1/2] x86/microcode: Do not access MSR_IA32_PLATFORM_ID when running as a guest
From: Xiaoyao Li
Date: Thu May 14 2026 - 08:40:05 EST
On 5/14/2026 4:06 AM, Borislav Petkov wrote:
Patch in Fixes: causes the usual:
unchecked MSR access error: RDMSR from 0x17 at ... (intel_get_platform_id)
Call Trace:
early_init_intel
early_cpu_init
setup_arch
_printk
start_kernel
x86_64_start_reservations
x86_64_start_kernel
common_startup_64
because the kernel is booted in a guest.
In order to avoid it, this MSR access needs to be prevented when running
virtualized. That is usually done by checking X86_FEATURE_HYPERVISOR but
for this particular case it is too early yet.
The platform ID needs to be read as early as when microcode is loaded on
the BSP:
load_ucode_bsp ... -> get_microcode_blob ... -> intel_find_matching_signature
and by that time, CPUID leafs haven't been parsed yet.
The microcode loader already has logic to check early whether the kernel
is running virtualized so make that globally available to arch/x86/. The
query whether running virtualized is getting more and more prominent in
recent times so might as well make it an arch-global var which the rest
of the code can use.
Fixes: d8630b67ca1ed ("x86/cpu: Add platform ID to CPU info structure")
Reported-by: Vishal Verma <vishal.l.verma@xxxxxxxxx>
Signed-off-by: Borislav Petkov (AMD) <bp@xxxxxxxxx>
Tested-by: Binbin Wu <binbin.wu@xxxxxxxxxxxxxxx>
Link: https://lore.kernel.org/r/20260430020953.1405535-1-binbin.wu@xxxxxxxxxxxxxxx
Reviewed-by: Xiaoyao Li <xiaoyao.li@xxxxxxxxx>
@@ -179,6 +172,11 @@ void __init load_ucode_bsp(void)
early_parse_cmdline();
+ if (!cpuid_feature())
+ dis_ucode_ldr = true;
+ else
+ x86_hypervisor_present = native_cpuid_ecx(1) & BIT(31);
+
IIUC, the reason why move the initialization of x86_hypervisor_present from microcode_loader_disabled to here is to make sure x86_hypervisor_present is always initialized, right?
But initializing x86_hypervisor_present by load_ucode_bsp() depends on CONFIG_MICROCODE, which depends on CPU_SUP_AMD || CPU_SUP_INTEL. So when both CPU_SUP_AMD and CPU_SUP_INTEL are not enabled, x86_hypervisor_present will always be 0. It's not a problem for now, we can solve it when x86_hypervisor_present is going to be used by CENTAUR or ZHAOXIN.