diff options
author | Wei Huang <wei.huang2@amd.com> | 2011-10-25 16:44:40 +0100 |
---|---|---|
committer | Wei Huang <wei.huang2@amd.com> | 2011-10-25 16:44:40 +0100 |
commit | 584df17dd943eac6c17ee56346f7d1a2ea045436 (patch) | |
tree | 0e86de8b24361c7ec53f52da320fb8d02eb4c20b | |
parent | 2b81c215e9c82b50453d2a50a77dd2c7ecdcb144 (diff) | |
download | xen-584df17dd943eac6c17ee56346f7d1a2ea045436.tar.gz xen-584df17dd943eac6c17ee56346f7d1a2ea045436.tar.bz2 xen-584df17dd943eac6c17ee56346f7d1a2ea045436.zip |
amd xsave: Move xsave initialization code to a common place
This patch moves xsave/xrstor code to CPU common file. First of all,
it prepares xsave/xrstor support for AMD CPUs. Secondly, Xen would
crash on __context_switch() without this patch on xsave-capable AMD
CPUs. The crash was due to cpu_has_xsave reports true in domain.c
while xsave space wasn't initialized.
Signed-off-by: Wei Huang <wei.huang2@amd.com>
xen-unstable changeset: 22462:98eb4a334b77
xen-unstable date: Tue Dec 07 18:26:38 2010 +0000
-rw-r--r-- | xen/arch/x86/cpu/common.c | 10 | ||||
-rw-r--r-- | xen/arch/x86/cpu/intel.c | 9 |
2 files changed, 10 insertions, 9 deletions
diff --git a/xen/arch/x86/cpu/common.c b/xen/arch/x86/cpu/common.c index 87d1a50c64..eda7534c1c 100644 --- a/xen/arch/x86/cpu/common.c +++ b/xen/arch/x86/cpu/common.c @@ -22,6 +22,9 @@ static int cachesize_override __cpuinitdata = -1; static int disable_x86_fxsr __cpuinitdata; static int disable_x86_serial_nr __cpuinitdata; +static int use_xsave; +boolean_param("xsave", use_xsave); + struct cpu_dev * cpu_devs[X86_VENDOR_NUM] = {}; /* @@ -391,6 +394,13 @@ void __cpuinit identify_cpu(struct cpuinfo_x86 *c) if (this_cpu->c_init) this_cpu->c_init(c); + /* Initialize xsave/xrstor features */ + if ( !use_xsave ) + clear_bit(X86_FEATURE_XSAVE, boot_cpu_data.x86_capability); + + if ( cpu_has_xsave ) + xsave_init(); + /* Disable the PN if appropriate */ squash_the_stupid_serial_number(c); diff --git a/xen/arch/x86/cpu/intel.c b/xen/arch/x86/cpu/intel.c index 1f3fcf7393..8f19b1ce20 100644 --- a/xen/arch/x86/cpu/intel.c +++ b/xen/arch/x86/cpu/intel.c @@ -30,9 +30,6 @@ static unsigned int opt_cpuid_mask_ecx, opt_cpuid_mask_edx; integer_param("cpuid_mask_ecx", opt_cpuid_mask_ecx); integer_param("cpuid_mask_edx", opt_cpuid_mask_edx); -static int use_xsave; -boolean_param("xsave", use_xsave); - #ifdef CONFIG_X86_INTEL_USERCOPY /* * Alignment at which movsl is preferred for bulk memory copies. @@ -219,12 +216,6 @@ static void __devinit init_intel(struct cpuinfo_x86 *c) set_bit(X86_FEATURE_ARAT, c->x86_capability); start_vmx(); - - if ( !use_xsave ) - clear_bit(X86_FEATURE_XSAVE, boot_cpu_data.x86_capability); - - if ( cpu_has_xsave ) - xsave_init(); } |