diff --git a/xen/arch/x86/cpu-policy.c b/xen/arch/x86/cpu-policy.c index a58bf6cad5..ef6a2d0d18 100644 --- a/xen/arch/x86/cpu-policy.c +++ b/xen/arch/x86/cpu-policy.c @@ -15,7 +15,7 @@ #include #include -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 61cd36d601..cd456c476f 100644 --- a/xen/arch/x86/cpu/microcode/core.c +++ b/xen/arch/x86/cpu/microcode/core.c @@ -34,6 +34,7 @@ #include #include +#include #include #include #include @@ -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 b361537a60..99d5a8e67e 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 */