| 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 |
| @@ -558,8 +558,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)) |
| @@ -573,7 +571,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; |
| } |