Commit 1b2fd70c authored by Alexander Graf's avatar Alexander Graf Committed by Avi Kivity

KVM: Add FFXSR support

AMD K10 CPUs implement the FFXSR feature that gets enabled using
EFER. Let's check if the virtual CPU description includes that
CPUID feature bit and allow enabling it then.

This is required for Windows Server 2008 in Hyper-V mode.

v2 adds CPUID capability exposure
Signed-off-by: default avatarAlexander Graf <agraf@suse.de>
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent d2062693
...@@ -417,6 +417,9 @@ static __init int svm_hardware_setup(void) ...@@ -417,6 +417,9 @@ static __init int svm_hardware_setup(void)
if (boot_cpu_has(X86_FEATURE_NX)) if (boot_cpu_has(X86_FEATURE_NX))
kvm_enable_efer_bits(EFER_NX); kvm_enable_efer_bits(EFER_NX);
if (boot_cpu_has(X86_FEATURE_FXSR_OPT))
kvm_enable_efer_bits(EFER_FFXSR);
if (nested) { if (nested) {
printk(KERN_INFO "kvm: Nested Virtualization enabled\n"); printk(KERN_INFO "kvm: Nested Virtualization enabled\n");
kvm_enable_efer_bits(EFER_SVME); kvm_enable_efer_bits(EFER_SVME);
......
...@@ -490,6 +490,17 @@ static void set_efer(struct kvm_vcpu *vcpu, u64 efer) ...@@ -490,6 +490,17 @@ static void set_efer(struct kvm_vcpu *vcpu, u64 efer)
return; return;
} }
if (efer & EFER_FFXSR) {
struct kvm_cpuid_entry2 *feat;
feat = kvm_find_cpuid_entry(vcpu, 0x80000001, 0);
if (!feat || !(feat->edx & bit(X86_FEATURE_FXSR_OPT))) {
printk(KERN_DEBUG "set_efer: #GP, enable FFXSR w/o CPUID capability\n");
kvm_inject_gp(vcpu, 0);
return;
}
}
if (efer & EFER_SVME) { if (efer & EFER_SVME) {
struct kvm_cpuid_entry2 *feat; struct kvm_cpuid_entry2 *feat;
...@@ -1240,6 +1251,7 @@ static void do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, ...@@ -1240,6 +1251,7 @@ static void do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
bit(X86_FEATURE_LM) | bit(X86_FEATURE_LM) |
#endif #endif
bit(X86_FEATURE_FXSR_OPT) |
bit(X86_FEATURE_MMXEXT) | bit(X86_FEATURE_MMXEXT) |
bit(X86_FEATURE_3DNOWEXT) | bit(X86_FEATURE_3DNOWEXT) |
bit(X86_FEATURE_3DNOW); bit(X86_FEATURE_3DNOW);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment