]> xenbits.xensource.com Git - people/vhanquez/xen.git/commitdiff
x86: Hide CPUID leaf 7 from PV guests.
authorKeir Fraser <keir@xen.org>
Thu, 2 Jun 2011 13:45:00 +0000 (14:45 +0100)
committerKeir Fraser <keir@xen.org>
Thu, 2 Jun 2011 13:45:00 +0000 (14:45 +0100)
Except for the whitelisted FSGSBASE feature.

Signed-off-by: Keir Fraser <keir@xen.org>
xen-unstable changeset:   23461:5839e797a130
xen-unstable date:        Thu Jun 02 14:39:50 2011 +0100

tools/libxc/xc_cpufeature.h
tools/libxc/xc_cpuid_x86.c
xen/arch/x86/traps.c

index 5263774ab3fbab0b149f8940c04c0ea9016f2ceb..d8bb6cb27fea92438fb16702ed803a1f853ef263 100644 (file)
 #define X86_FEATURE_TBM         (6*32+21) /* trailing bit manipulations */
 #define X86_FEATURE_TOPOEXT     (6*32+22) /* topology extensions CPUID leafs */
 
+/* Intel-defined CPU features, CPUID level 0x00000007:0 (ebx), word 9 */
+#define X86_FEATURE_FSGSBASE   (7*32+ 0) /* {RD,WR}{FS,GS}BASE instructions */
+
 #endif /* __LIBXC_CPUFEATURE_H */
index 44cc8398b397538c700d122557ccf707b9312e1f..a30d9a89e61d45fa357fcb4c6cc3df66ab51e959 100644 (file)
@@ -414,6 +414,14 @@ static void xc_cpuid_pv_policy(
         set_bit(X86_FEATURE_HYPERVISOR, regs[2]);
         break;
 
+    case 7:
+        if ( input[1] == 0 )
+            regs[1] &= bitmaskof(X86_FEATURE_FSGSBASE);
+        else
+            regs[1] = 0;
+        regs[0] = regs[2] = regs[3] = 0;
+        break;
+
     case 0x0000000d:
         xc_cpuid_config_xsave(xch, domid, xfeature_mask, input, regs);
         break;
@@ -553,7 +561,7 @@ int xc_cpuid_apply_policy(xc_interface *xch, domid_t domid)
             input[0] = 0x80000000u;
 
         input[1] = XEN_CPUID_INPUT_UNUSED;
-        if ( (input[0] == 4) || (input[0] == 0xd) )
+        if ( (input[0] == 4) || (input[0] == 7) || (input[0] == 0xd) )
             input[1] = 0;
 
         if ( (input[0] & 0x80000000u) && (input[0] > ext_max) )
index 61ee6da7cbbcdf899c272e9ec1bd6db657772c64..e86776ab5dcc291e3579bbf94cb61fdea79dcc0b 100644 (file)
@@ -780,6 +780,13 @@ static void pv_cpuid(struct cpu_user_regs *regs)
            __clear_bit(X86_FEATURE_X2APIC % 32, &c);
         __set_bit(X86_FEATURE_HYPERVISOR % 32, &c);
         break;
+    case 7:
+        if ( regs->ecx == 0 )
+            b &= cpufeat_mask(X86_FEATURE_FSGSBASE);
+        else
+            b = 0;
+        a = c = d = 0;
+        break;
     case 0x80000001:
         /* Modify Feature Information. */
         if ( is_pv_32bit_vcpu(current) )