[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] x86/ucode: Refresh raw CPU policy after microcode load
Loading microcode can cause new features to appear. This has happened routinely since Spectre/Meltdown, and even the presence of new status bits can mean the administrator has no further work to perform. Refresh the raw CPU policy after late microcode load, so xen-cpuid can reflect the updated state of the system. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx> CC: Wei Liu <wl@xxxxxxx> This is also the first step of being able to livepatch support for new functionality in microcode. --- xen/arch/x86/cpu-policy.c | 6 +++--- xen/arch/x86/cpu/microcode/core.c | 4 ++++ xen/arch/x86/include/asm/cpu-policy.h | 6 ++++++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/xen/arch/x86/cpu-policy.c b/xen/arch/x86/cpu-policy.c index a58bf6cad54e..ef6a2d0d180a 100644 --- a/xen/arch/x86/cpu-policy.c +++ b/xen/arch/x86/cpu-policy.c @@ -15,7 +15,7 @@ #include <asm/setup.h> #include <asm/xstate.h> -struct cpu_policy __ro_after_init raw_cpu_policy; +struct cpu_policy __read_mostly raw_cpu_policy; struct cpu_policy __ro_after_init host_cpu_policy; #ifdef CONFIG_PV struct cpu_policy __ro_after_init pv_max_cpu_policy; @@ -343,7 +343,7 @@ static void recalculate_misc(struct cpu_policy *p) } } -static void __init calculate_raw_policy(void) +void calculate_raw_cpu_policy(void) { struct cpu_policy *p = &raw_cpu_policy; @@ -655,7 +655,7 @@ static void __init calculate_hvm_def_policy(void) void __init init_guest_cpu_policies(void) { - calculate_raw_policy(); + calculate_raw_cpu_policy(); calculate_host_policy(); if ( IS_ENABLED(CONFIG_PV) ) diff --git a/xen/arch/x86/cpu/microcode/core.c b/xen/arch/x86/cpu/microcode/core.c index 61cd36d601d6..cd456c476fbf 100644 --- a/xen/arch/x86/cpu/microcode/core.c +++ b/xen/arch/x86/cpu/microcode/core.c @@ -34,6 +34,7 @@ #include <xen/watchdog.h> #include <asm/apic.h> +#include <asm/cpu-policy.h> #include <asm/delay.h> #include <asm/nmi.h> #include <asm/processor.h> @@ -677,6 +678,9 @@ static long cf_check microcode_update_helper(void *data) spin_lock(µcode_mutex); microcode_update_cache(patch); spin_unlock(µcode_mutex); + + /* Refresh the raw CPU policy, in case the features have changed. */ + calculate_raw_cpu_policy(); } else microcode_free_patch(patch); diff --git a/xen/arch/x86/include/asm/cpu-policy.h b/xen/arch/x86/include/asm/cpu-policy.h index b361537a602b..99d5a8e67eeb 100644 --- a/xen/arch/x86/include/asm/cpu-policy.h +++ b/xen/arch/x86/include/asm/cpu-policy.h @@ -24,4 +24,10 @@ void init_dom0_cpuid_policy(struct domain *d); /* Clamp the CPUID policy to reality. */ void recalculate_cpuid_policy(struct domain *d); +/* + * Collect the raw CPUID and MSR values. Called during boot, and after late + * microcode loading. + */ +void calculate_raw_cpu_policy(void); + #endif /* X86_CPU_POLICY_H */ -- 2.30.2
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |