p->platform_info.cpuid_faulting = cpu_has_cpuid_faulting;
}
+static void __init guest_common_max_feature_adjustments(uint32_t *fs)
+{
+ if ( boot_cpu_data.x86_vendor == X86_VENDOR_INTEL )
+ {
+ /*
+ * MSR_ARCH_CAPS is just feature data, and we can offer it to guests
+ * unconditionally, although limit it to Intel systems as it is highly
+ * uarch-specific.
+ *
+ * In particular, the RSBA and RRSBA bits mean "you might migrate to a
+ * system where RSB underflow uses alternative predictors (a.k.a
+ * Retpoline not safe)", so these need to be visible to a guest in all
+ * cases, even when it's only some other server in the pool which
+ * suffers the identified behaviour.
+ */
+ __set_bit(X86_FEATURE_ARCH_CAPS, fs);
+ }
+}
+
static void __init guest_common_default_feature_adjustments(uint32_t *fs)
{
/*
__clear_bit(X86_FEATURE_IBRS, fs);
}
+ guest_common_max_feature_adjustments(fs);
guest_common_feature_adjustments(fs);
sanitise_featureset(fs);
recalculate_xstate(p);
p->extd.raw[0xa] = EMPTY_LEAF; /* No SVM for PV guests. */
-
- p->arch_caps.raw = 0; /* Not supported yet. */
}
static void __init calculate_pv_def_policy(void)
__clear_bit(X86_FEATURE_XSAVES, fs);
}
+ guest_common_max_feature_adjustments(fs);
guest_common_feature_adjustments(fs);
sanitise_featureset(fs);
/* It's always possible to emulate CPUID faulting for HVM guests */
p->platform_info.cpuid_faulting = true;
-
- p->arch_caps.raw = 0; /* Not supported yet. */
}
static void __init calculate_hvm_def_policy(void)
* domain policy logic gains a better understanding of MSRs.
*/
if ( is_hardware_domain(d) && cpu_has_arch_caps )
+ {
p->feat.arch_caps = true;
+ p->arch_caps.raw = host_cpu_policy.arch_caps.raw;
+ }
/* Apply dom0-cpuid= command line settings, if provided. */
if ( dom0_cpuid_cmdline )
p->platform_info.cpuid_faulting = false;
recalculate_cpuid_policy(d);
-
- if ( is_hardware_domain(d) && cpu_has_arch_caps )
- {
- uint64_t val;
-
- rdmsrl(MSR_ARCH_CAPABILITIES, val);
-
- p->arch_caps.raw = val &
- (ARCH_CAPS_RDCL_NO | ARCH_CAPS_IBRS_ALL | ARCH_CAPS_RSBA |
- ARCH_CAPS_SSB_NO | ARCH_CAPS_MDS_NO | ARCH_CAPS_IF_PSCHANGE_MC_NO |
- ARCH_CAPS_TAA_NO | ARCH_CAPS_SBDR_SSDP_NO | ARCH_CAPS_FBSDP_NO |
- ARCH_CAPS_PSDP_NO | ARCH_CAPS_FB_CLEAR | ARCH_CAPS_RRSBA |
- ARCH_CAPS_BHI_NO | ARCH_CAPS_PBRSB_NO);
- }
}
static void __init __maybe_unused build_assertions(void)
XEN_CPUFEATURE(IBRSB, 9*32+26) /*A IBRS and IBPB support (used by Intel) */
XEN_CPUFEATURE(STIBP, 9*32+27) /*A STIBP */
XEN_CPUFEATURE(L1D_FLUSH, 9*32+28) /*S MSR_FLUSH_CMD and L1D flush. */
-XEN_CPUFEATURE(ARCH_CAPS, 9*32+29) /*a IA32_ARCH_CAPABILITIES MSR */
+XEN_CPUFEATURE(ARCH_CAPS, 9*32+29) /*!a IA32_ARCH_CAPABILITIES MSR */
XEN_CPUFEATURE(CORE_CAPS, 9*32+30) /* IA32_CORE_CAPABILITIES MSR */
XEN_CPUFEATURE(SSBD, 9*32+31) /*A MSR_SPEC_CTRL.SSBD available */