KVM: x86: Enable Intel AVX-512 for guest
Expose Intel AVX-512 feature bits to guest. Also add checks for xcr0 AVX512 related bits according to spec: http://download-software.intel.com/sites/default/files/managed/71/2e/319433-017.pdf Signed-off-by: Chao Peng <chao.p.peng@linux.intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
7f05db6a20
commit
612263b30c
|
@ -16,6 +16,7 @@
|
||||||
#define XSTATE_Hi16_ZMM 0x80
|
#define XSTATE_Hi16_ZMM 0x80
|
||||||
|
|
||||||
#define XSTATE_FPSSE (XSTATE_FP | XSTATE_SSE)
|
#define XSTATE_FPSSE (XSTATE_FP | XSTATE_SSE)
|
||||||
|
#define XSTATE_AVX512 (XSTATE_OPMASK | XSTATE_ZMM_Hi256 | XSTATE_Hi16_ZMM)
|
||||||
/* Bit 63 of XCR0 is reserved for future expansion */
|
/* Bit 63 of XCR0 is reserved for future expansion */
|
||||||
#define XSTATE_EXTEND_MASK (~(XSTATE_FPSSE | (1ULL << 63)))
|
#define XSTATE_EXTEND_MASK (~(XSTATE_FPSSE | (1ULL << 63)))
|
||||||
|
|
||||||
|
|
|
@ -317,7 +317,8 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
|
||||||
const u32 kvm_supported_word9_x86_features =
|
const u32 kvm_supported_word9_x86_features =
|
||||||
F(FSGSBASE) | F(BMI1) | F(HLE) | F(AVX2) | F(SMEP) |
|
F(FSGSBASE) | F(BMI1) | F(HLE) | F(AVX2) | F(SMEP) |
|
||||||
F(BMI2) | F(ERMS) | f_invpcid | F(RTM) | f_mpx | F(RDSEED) |
|
F(BMI2) | F(ERMS) | f_invpcid | F(RTM) | f_mpx | F(RDSEED) |
|
||||||
F(ADX) | F(SMAP);
|
F(ADX) | F(SMAP) | F(AVX512F) | F(AVX512PF) | F(AVX512ER) |
|
||||||
|
F(AVX512CD);
|
||||||
|
|
||||||
/* all calls to cpuid_count() should be made on the same cpu */
|
/* all calls to cpuid_count() should be made on the same cpu */
|
||||||
get_cpu();
|
get_cpu();
|
||||||
|
|
|
@ -666,6 +666,12 @@ int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr)
|
||||||
if ((!(xcr0 & XSTATE_BNDREGS)) != (!(xcr0 & XSTATE_BNDCSR)))
|
if ((!(xcr0 & XSTATE_BNDREGS)) != (!(xcr0 & XSTATE_BNDCSR)))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
if (xcr0 & XSTATE_AVX512) {
|
||||||
|
if (!(xcr0 & XSTATE_YMM))
|
||||||
|
return 1;
|
||||||
|
if ((xcr0 & XSTATE_AVX512) != XSTATE_AVX512)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
kvm_put_guest_xcr0(vcpu);
|
kvm_put_guest_xcr0(vcpu);
|
||||||
vcpu->arch.xcr0 = xcr0;
|
vcpu->arch.xcr0 = xcr0;
|
||||||
|
|
||||||
|
|
|
@ -162,7 +162,8 @@ int kvm_write_guest_virt_system(struct x86_emulate_ctxt *ctxt,
|
||||||
bool kvm_mtrr_valid(struct kvm_vcpu *vcpu, u32 msr, u64 data);
|
bool kvm_mtrr_valid(struct kvm_vcpu *vcpu, u32 msr, u64 data);
|
||||||
|
|
||||||
#define KVM_SUPPORTED_XCR0 (XSTATE_FP | XSTATE_SSE | XSTATE_YMM \
|
#define KVM_SUPPORTED_XCR0 (XSTATE_FP | XSTATE_SSE | XSTATE_YMM \
|
||||||
| XSTATE_BNDREGS | XSTATE_BNDCSR)
|
| XSTATE_BNDREGS | XSTATE_BNDCSR \
|
||||||
|
| XSTATE_AVX512)
|
||||||
extern u64 host_xcr0;
|
extern u64 host_xcr0;
|
||||||
|
|
||||||
extern u64 kvm_supported_xcr0(void);
|
extern u64 kvm_supported_xcr0(void);
|
||||||
|
|
Loading…
Reference in New Issue