KVM: x86: mask unsupported XSAVE entries from leaf 0Dh index 0
XSAVE entries that KVM does not support are reported by KVM_GET_SUPPORTED_CPUID for leaf 0Dh index 0 if the host supports them; they should be left out unless there is also hypervisor support for them. Sub-leafs are correctly handled in supported_xcr0_bit, fix index 0 to match. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Gleb Natapov <gleb@redhat.com>
This commit is contained in:
parent
29242cb5c6
commit
647e23bb33
|
@ -182,7 +182,7 @@ static bool supported_xcr0_bit(unsigned bit)
|
||||||
{
|
{
|
||||||
u64 mask = ((u64)1 << bit);
|
u64 mask = ((u64)1 << bit);
|
||||||
|
|
||||||
return mask & (XSTATE_FP | XSTATE_SSE | XSTATE_YMM) & host_xcr0;
|
return mask & KVM_SUPPORTED_XCR0 & host_xcr0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define F(x) bit(X86_FEATURE_##x)
|
#define F(x) bit(X86_FEATURE_##x)
|
||||||
|
@ -383,6 +383,8 @@ static int do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
|
||||||
case 0xd: {
|
case 0xd: {
|
||||||
int idx, i;
|
int idx, i;
|
||||||
|
|
||||||
|
entry->eax &= host_xcr0 & KVM_SUPPORTED_XCR0;
|
||||||
|
entry->edx &= (host_xcr0 & KVM_SUPPORTED_XCR0) >> 32;
|
||||||
entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
|
entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
|
||||||
for (idx = 1, i = 1; idx < 64; ++idx) {
|
for (idx = 1, i = 1; idx < 64; ++idx) {
|
||||||
if (*nent >= maxnent)
|
if (*nent >= maxnent)
|
||||||
|
|
|
@ -122,6 +122,7 @@ int kvm_write_guest_virt_system(struct x86_emulate_ctxt *ctxt,
|
||||||
gva_t addr, void *val, unsigned int bytes,
|
gva_t addr, void *val, unsigned int bytes,
|
||||||
struct x86_exception *exception);
|
struct x86_exception *exception);
|
||||||
|
|
||||||
|
#define KVM_SUPPORTED_XCR0 (XSTATE_FP | XSTATE_SSE | XSTATE_YMM)
|
||||||
extern u64 host_xcr0;
|
extern u64 host_xcr0;
|
||||||
|
|
||||||
extern struct static_key kvm_no_apic_vcpu;
|
extern struct static_key kvm_no_apic_vcpu;
|
||||||
|
|
Loading…
Reference in New Issue