]> xenbits.xensource.com Git - xen.git/commitdiff
x86/intel: Expose MSR_ARCH_CAPS to dom0
authorAndrew Cooper <andrew.cooper3@citrix.com>
Fri, 11 Sep 2020 12:59:48 +0000 (14:59 +0200)
committerJan Beulich <jbeulich@suse.com>
Fri, 11 Sep 2020 12:59:48 +0000 (14:59 +0200)
The overhead of (the lack of) MDS_NO alone has been measured at 30% on some
workloads.  While we're not in a position yet to offer MSR_ARCH_CAPS generally
to guests, dom0 doesn't migrate, so we can pass a subset of hardware values
straight through.

This will cause PVH dom0's not to use KPTI by default, and all dom0's not to
use VERW flushing by default, and to use eIBRS in preference to retpoline on
recent Intel CPUs.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
master commit: e46474278a0e87e2b32ad5dd5fc20e8d2cb0688b
master date: 2020-08-31 13:43:26 +0100

xen/arch/x86/cpuid.c
xen/arch/x86/msr.c

index 56072d4316b968b7b249250ab761b8af145f7f98..07f52e713090f81785baa245ea57136d881bf374 100644 (file)
@@ -634,6 +634,14 @@ int init_domain_cpuid_policy(struct domain *d)
 
     recalculate_cpuid_policy(d);
 
+    /*
+     * Expose the "hardware speculation behaviour" bits of ARCH_CAPS to dom0,
+     * so dom0 can turn off workarounds as appropriate.  Temporary, until the
+     * domain policy logic gains a better understanding of MSRs.
+     */
+    if ( is_hardware_domain(d) && boot_cpu_has(X86_FEATURE_ARCH_CAPS) )
+        p->feat.arch_caps = true;
+
     return 0;
 }
 
index 0579c6a396f5a05eda3ccb758d5cd4e6583bda65..4677222c405ec92e863aa1008de8aaa88ba6f3bf 100644 (file)
@@ -95,6 +95,22 @@ int init_domain_msr_policy(struct domain *d)
     if ( is_control_domain(d) )
         mp->plaform_info.cpuid_faulting = false;
 
+    /*
+     * Expose the "hardware speculation behaviour" bits of ARCH_CAPS to dom0,
+     * so dom0 can turn off workarounds as appropriate.  Temporary, until the
+     * domain policy logic gains a better understanding of MSRs.
+     */
+    if ( is_hardware_domain(d) && boot_cpu_has(X86_FEATURE_ARCH_CAPS) )
+    {
+        uint64_t val;
+
+        rdmsrl(MSR_ARCH_CAPABILITIES, val);
+
+        mp->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_TAA_NO);
+    }
+
     d->arch.msr = mp;
 
     return 0;