# HG changeset patch
# User Keir Fraser <keir@xxxxxxx>
# Date 1285340308 -3600
# Node ID b98a20571670d905bb32eef98e2991a563e9f4fa
# Parent c9f461d6ea1db06e3434f8c1a29f2568f2b45f54
x86: check CPUID level before enabling xsave
While not as relevant after c/s 21894, is still seems safer to check
the CPUID level here, just like Linux does. The is particularly
relevant for the 4.0 tree (which doesn't have said c/s), but also
possibly for nested environments where writing MSR_IA32_MISC_ENABLE
may not actually take effect (Xen itself ignores such writes).
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
xen-unstable changeset: 22213:eb247ea9db8c
xen-unstable date: Fri Sep 24 15:53:31 2010 +0100
---
xen/arch/x86/i387.c | 11 +++++++++--
1 files changed, 9 insertions(+), 2 deletions(-)
diff -r c9f461d6ea1d -r b98a20571670 xen/arch/x86/i387.c
--- a/xen/arch/x86/i387.c Fri Sep 24 15:57:35 2010 +0100
+++ b/xen/arch/x86/i387.c Fri Sep 24 15:58:28 2010 +0100
@@ -132,6 +132,8 @@ void restore_fpu(struct vcpu *v)
}
}
+#define XSTATE_CPUID 0xd
+
/*
* Maximum size (in byte) of the XSAVE/XRSTOR save area required by all
* the supported and enabled features on the processor, including the
@@ -148,7 +150,12 @@ void xsave_init(void)
int cpu = smp_processor_id();
u32 min_size;
- cpuid_count(0xd, 0, &eax, &ebx, &ecx, &edx);
+ if ( boot_cpu_data.cpuid_level < XSTATE_CPUID ) {
+ printk(XENLOG_ERR "XSTATE_CPUID missing\n");
+ return;
+ }
+
+ cpuid_count(XSTATE_CPUID, 0, &eax, &ebx, &ecx, &edx);
printk("%s: cpu%d: cntxt_max_size: 0x%x and states: %08x:%08x\n",
__func__, cpu, ecx, edx, eax);
@@ -169,7 +176,7 @@ void xsave_init(void)
*/
set_in_cr4(X86_CR4_OSXSAVE);
set_xcr0(eax & XCNTXT_MASK);
- cpuid_count(0xd, 0, &eax, &ebx, &ecx, &edx);
+ cpuid_count(XSTATE_CPUID, 0, &eax, &ebx, &ecx, &edx);
clear_in_cr4(X86_CR4_OSXSAVE);
if ( cpu == 0 )
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|