KVM: x86: introduce kvm_supported_xcr0()
authorPaolo Bonzini <pbonzini@redhat.com>
Mon, 24 Feb 2014 11:15:16 +0000 (12:15 +0100)
committerPaolo Bonzini <pbonzini@redhat.com>
Mon, 17 Mar 2014 11:21:38 +0000 (12:21 +0100)
commit4ff417320c2dfc984ec1939a7da888976441a881
tree3448c4e65aecd71260c9bbe4e99c70533c6055e9
parent94b3ffcd41a90d2cb0b32ca23aa58a01111d5dc0
KVM: x86: introduce kvm_supported_xcr0()

XSAVE support for KVM is already using host_xcr0 & KVM_SUPPORTED_XCR0 as
a "dynamic" version of KVM_SUPPORTED_XCR0.

However, this is not enough because the MPX bits should not be presented
to the guest unless kvm_x86_ops confirms the support.  So, replace all
instances of host_xcr0 & KVM_SUPPORTED_XCR0 with a new function
kvm_supported_xcr0() that also has this check.

Note that here:

if (xstate_bv & ~KVM_SUPPORTED_XCR0)
return -EINVAL;
if (xstate_bv & ~host_cr0)
return -EINVAL;

the code is equivalent to

if ((xstate_bv & ~KVM_SUPPORTED_XCR0) ||
    (xstate_bv & ~host_cr0)
return -EINVAL;

i.e. "xstate_bv & (~KVM_SUPPORTED_XCR0 | ~host_cr0)" which is in turn
equal to "xstate_bv & ~(KVM_SUPPORTED_XCR0 & host_cr0)".  So we should
also use the new function there.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/cpuid.c
arch/x86/kvm/x86.c
arch/x86/kvm/x86.h