From: Keir Fraser Date: Thu, 2 Jun 2011 13:45:00 +0000 (+0100) Subject: x86: Hide CPUID leaf 7 from PV guests. X-Git-Tag: 4.1.1-rc2~1 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=8d7c5d8edfb575a082ed89585c02e7d255725e2a;p=people%2Fvhanquez%2Fxen.git x86: Hide CPUID leaf 7 from PV guests. Except for the whitelisted FSGSBASE feature. Signed-off-by: Keir Fraser xen-unstable changeset: 23461:5839e797a130 xen-unstable date: Thu Jun 02 14:39:50 2011 +0100 --- diff --git a/tools/libxc/xc_cpufeature.h b/tools/libxc/xc_cpufeature.h index 5263774ab..d8bb6cb27 100644 --- a/tools/libxc/xc_cpufeature.h +++ b/tools/libxc/xc_cpufeature.h @@ -141,4 +141,7 @@ #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 */ diff --git a/tools/libxc/xc_cpuid_x86.c b/tools/libxc/xc_cpuid_x86.c index 44cc8398b..a30d9a89e 100644 --- a/tools/libxc/xc_cpuid_x86.c +++ b/tools/libxc/xc_cpuid_x86.c @@ -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) ) diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 61ee6da7c..e86776ab5 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -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) )