diff -r 985f5fa8fc59 tools/libxc/xc_cpuid_x86.c --- a/tools/libxc/xc_cpuid_x86.c Mon Nov 08 17:25:54 2010 +0000 +++ b/tools/libxc/xc_cpuid_x86.c Tue Nov 09 10:41:09 2010 +0800 @@ -195,7 +195,8 @@ static void xc_cpuid_hvm_policy( bitmaskof(X86_FEATURE_SSE4_1) | bitmaskof(X86_FEATURE_SSE4_2) | bitmaskof(X86_FEATURE_POPCNT) | - bitmaskof(X86_FEATURE_AES)); + bitmaskof(X86_FEATURE_AES) | + bitmaskof(X86_FEATURE_AVX)); regs[2] |= bitmaskof(X86_FEATURE_HYPERVISOR); @@ -281,6 +282,7 @@ static void xc_cpuid_pv_policy( { DECLARE_DOMCTL; int guest_64bit, xen_64bit = hypervisor_is_64bit(xch); + int xsave_supported = 0; char brand[13]; xc_cpuid_brand_get(brand); @@ -290,6 +292,17 @@ static void xc_cpuid_pv_policy( domctl.cmd = XEN_DOMCTL_get_address_size; do_domctl(xch, &domctl); guest_64bit = (domctl.u.address_size.size == 64); + + /* Detecting Xen's atitude towards XSAVE */ + memset(&domctl, 0, sizeof(domctl)); + domctl.cmd = XEN_DOMCTL_getvcpuextstate; + domctl.domain = domid; + domctl.u.vcpuextstate.vcpu = 0; + domctl.u.vcpuextstate.size = 0; + domctl.u.vcpuextstate.xfeature_mask = 0; + do_domctl(xch, &domctl); + if ( domctl.u.vcpuextstate.xfeature_mask != 0 ) + xsave_supported = 1; if ( (input[0] & 0x7fffffff) == 1 ) { @@ -320,10 +333,11 @@ static void xc_cpuid_pv_policy( clear_bit(X86_FEATURE_TM2, regs[2]); if ( !guest_64bit ) clear_bit(X86_FEATURE_CX16, regs[2]); + if ( !xsave_supported ) + clear_bit(X86_FEATURE_XSAVE, regs[2]); clear_bit(X86_FEATURE_XTPR, regs[2]); clear_bit(X86_FEATURE_PDCM, regs[2]); clear_bit(X86_FEATURE_DCA, regs[2]); - clear_bit(X86_FEATURE_XSAVE, regs[2]); set_bit(X86_FEATURE_HYPERVISOR, regs[2]); break; case 0x80000001: diff -r 985f5fa8fc59 xen/arch/x86/traps.c --- a/xen/arch/x86/traps.c Mon Nov 08 17:25:54 2010 +0000 +++ b/xen/arch/x86/traps.c Tue Nov 09 09:40:27 2010 +0800 @@ -795,7 +795,8 @@ static void pv_cpuid(struct cpu_user_reg __clear_bit(X86_FEATURE_XTPR % 32, &c); __clear_bit(X86_FEATURE_PDCM % 32, &c); __clear_bit(X86_FEATURE_DCA % 32, &c); - __clear_bit(X86_FEATURE_XSAVE % 32, &c); + if ( !cpu_has_xsave ) + __clear_bit(X86_FEATURE_XSAVE % 32, &c); if ( !cpu_has_apic ) __clear_bit(X86_FEATURE_X2APIC % 32, &c); __set_bit(X86_FEATURE_HYPERVISOR % 32, &c);