diff mbox

[2/2] Add FFXSR support to KVM

Message ID 1233134533-3255-3-git-send-email-agraf@suse.de (mailing list archive)
State Accepted, archived
Headers show

Commit Message

Alexander Graf Jan. 28, 2009, 9:22 a.m. UTC
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.

Signed-off-by: Alexander Graf <agraf@suse.de>
---
 arch/x86/kvm/svm.c |    3 +++
 arch/x86/kvm/x86.c |   11 +++++++++++
 2 files changed, 14 insertions(+), 0 deletions(-)

Comments

Avi Kivity Feb. 2, 2009, 2:14 p.m. UTC | #1
Alexander Graf wrote:
> 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.
>
>   

Need to advertise this in KVM_GET_SUPPORTED_CPUID.  Otherwise, looks good.
diff mbox

Patch

diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index db5021b..1c4a018 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -417,6 +417,9 @@  static __init int svm_hardware_setup(void)
 	if (boot_cpu_has(X86_FEATURE_NX))
 		kvm_enable_efer_bits(EFER_NX);
 
+	if (boot_cpu_has(X86_FEATURE_FXSR_OPT))
+		kvm_enable_efer_bits(EFER_FFXSR);
+
 	if (nested) {
 		printk(KERN_INFO "kvm: Nested Virtualization enabled\n");
 		kvm_enable_efer_bits(EFER_SVME);
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index e96edda..cb3529d 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -490,6 +490,17 @@  static void set_efer(struct kvm_vcpu *vcpu, u64 efer)
 		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) {
 		struct kvm_cpuid_entry2 *feat;