--- /dev/null
+From 764bcbc5a6d7a2f3e75c9f0e4caa984e2926e346 Mon Sep 17 00:00:00 2001
+From: "Zhanghaoyu (A)" <haoyu.zhang@huawei.com>
+Date: Fri, 14 Jun 2013 07:36:13 +0000
+Subject: KVM: x86: remove vcpu's CPL check in host-invoked XCR set
+
+From: "Zhanghaoyu (A)" <haoyu.zhang@huawei.com>
+
+commit 764bcbc5a6d7a2f3e75c9f0e4caa984e2926e346 upstream.
+
+__kvm_set_xcr function does the CPL check when set xcr. __kvm_set_xcr is
+called in two flows, one is invoked by guest, call stack shown as below,
+
+ handle_xsetbv(or xsetbv_interception)
+ kvm_set_xcr
+ __kvm_set_xcr
+
+the other one is invoked by host, for example during system reset:
+
+ kvm_arch_vcpu_ioctl
+ kvm_vcpu_ioctl_x86_set_xcrs
+ __kvm_set_xcr
+
+The former does need the CPL check, but the latter does not.
+
+Signed-off-by: Zhang Haoyu <haoyu.zhang@huawei.com>
+[Tweaks to commit message. - Paolo]
+Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/kvm/x86.c | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+--- a/arch/x86/kvm/x86.c
++++ b/arch/x86/kvm/x86.c
+@@ -548,8 +548,6 @@ int __kvm_set_xcr(struct kvm_vcpu *vcpu,
+ if (index != XCR_XFEATURE_ENABLED_MASK)
+ return 1;
+ xcr0 = xcr;
+- if (kvm_x86_ops->get_cpl(vcpu) != 0)
+- return 1;
+ if (!(xcr0 & XSTATE_FP))
+ return 1;
+ if ((xcr0 & XSTATE_YMM) && !(xcr0 & XSTATE_SSE))
+@@ -563,7 +561,8 @@ int __kvm_set_xcr(struct kvm_vcpu *vcpu,
+
+ int kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr)
+ {
+- if (__kvm_set_xcr(vcpu, index, xcr)) {
++ if (kvm_x86_ops->get_cpl(vcpu) != 0 ||
++ __kvm_set_xcr(vcpu, index, xcr)) {
+ kvm_inject_gp(vcpu, 0);
+ return 1;
+ }