mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86/ucode: Fix stability of the raw CPU Policy rescan
Always run microcode_update_helper() on the BSP, so the the updated Raw CPU
policy doesn't get non-BSP topology details included.
Have calculate_raw_cpu_policy() clear the instantanious XSTATE sizes. The
value XCR0 | MSR_XSS had when we scanned the policy isn't terribly interesting
to report.
When CPUID Masking is active, it affects CPUID instructions issued by Xen
too. Transiently disable masking to get a clean scan.
Fixes: 694d79ed5a ("x86/ucode: Refresh raw CPU policy after microcode load")
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
052d78fbec
commit
cf7fe8b72d
2 files changed
+24
-3
No files matched your search
@@ -353,6 +353,13 @@ void calculate_raw_cpu_policy(void)
|
||||
/* Nothing good will come from Xen and libx86 disagreeing on vendor. */
|
||||
ASSERT(p->x86_vendor == boot_cpu_data.x86_vendor);
|
||||
|
||||
/*
|
||||
* Clear the truly dynamic fields. These vary with the in-context XCR0
|
||||
* and MSR_XSS, and aren't interesting fields in the raw policy.
|
||||
*/
|
||||
p->xstate.raw[0].b = 0;
|
||||
p->xstate.raw[1].b = 0;
|
||||
|
||||
/* 0x000000ce MSR_INTEL_PLATFORM_INFO */
|
||||
/* Was already added by probe_cpuid_faulting() */
|
||||
}
|
||||
|
||||
@@ -680,8 +680,18 @@ static long cf_check microcode_update_helper(void *data)
|
||||
microcode_update_cache(patch);
|
||||
spin_unlock(µcode_mutex);
|
||||
|
||||
/* Refresh the raw CPU policy, in case the features have changed. */
|
||||
/*
|
||||
* Refresh the raw CPU policy, in case the features have changed.
|
||||
* Disable CPUID masking if in use, to avoid having current's
|
||||
* cpu_policy affect the rescan.
|
||||
*/
|
||||
if ( ctxt_switch_masking )
|
||||
alternative_vcall(ctxt_switch_masking, NULL);
|
||||
|
||||
calculate_raw_cpu_policy();
|
||||
|
||||
if ( ctxt_switch_masking )
|
||||
alternative_vcall(ctxt_switch_masking, current);
|
||||
}
|
||||
else
|
||||
microcode_free_patch(patch);
|
||||
@@ -721,8 +731,12 @@ int microcode_update(XEN_GUEST_HANDLE(const_void) buf, unsigned long len)
|
||||
}
|
||||
buffer->len = len;
|
||||
|
||||
return continue_hypercall_on_cpu(smp_processor_id(),
|
||||
microcode_update_helper, buffer);
|
||||
/*
|
||||
* Always queue microcode_update_helper() on CPU0. Most of the logic
|
||||
* won't care, but the update of the Raw CPU policy wants to (re)run on
|
||||
* the BSP.
|
||||
*/
|
||||
return continue_hypercall_on_cpu(0, microcode_update_helper, buffer);
|
||||
}
|
||||
|
||||
static int __init cf_check microcode_init(void)
|
||||
|
||||