x86/cpuid: expose AVX512_4VNNIW and AVX512_4FMAPS features to kvm guest
PATCH v2 1/1 x86/cpuid: expose AVX512_4VNNIW and AVX512_4FMAPS features to kvm guest
The spec can be found in Intel Software Developer Manual or in Instruction Set Extensions Programming Reference.
Signed-off-by Luwei Kang <[email protected]>
Signed-off-by He Chen <[email protected]>
---
Changes in v2:
* add new macros for new AVX512 scattered features
* add a cpuid_count_edx function to processor.h
--- arch/x86/include/asm/processor.h | 9 +++++++++ arch/x86/kvm/cpuid.c | 13 ++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-)
arch/x86/include/asm/processor.h +9 -0
@@ -577,6 +577,15 @@ static inline unsigned int cpuid_edx(unsigned int op)return edx; } +static inline unsigned int cpuid_count_edx (unsigned op,unsigned count) +{ +unsigned int eax, ebx, ecx, edx; + +cpuid_count (op, count, &eax, &ebx, &ecx, &edx); + +return edx; +} +/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */ static __always_inline void rep_nop(void) {
arch/x86/kvm/cpuid.c +12 -1
@@ -65,6 +65,11 @@ u64 kvm_supported_xcr0(void)#define F (x) bit(X86_FEATURE_##x) +/* These are scattered features in cpufeatures.h. */ +#define KVM_CPUID_BIT_AVX512_4VNNIW 2 +#define KVM_CPUID_BIT_AVX512_4FMAPS 3 +#define KF (x) bit(KVM_CPUID_BIT_##x) +int kvm_update_cpuid (struct kvm_vcpu *vcpu) {struct kvm_cpuid_entry2 *best;
@@ -376,6 +381,10 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,/* cpuid 7.0.ecx*/ const u32 kvm_cpuid_7_0_ecx_x86_features =F (PKU ) |0 /*OSPKE*/ ; +/* cpuid 7.0.edx*/ +const u32 kvm_cpuid_7_0_edx_x86_features = +KF (AVX512_4VNNIW ) |KF (AVX512_4FMAPS ); +/* all calls to cpuid_count() should be made on the same cpu */ get_cpu ();
@@ -458,12 +467,14 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,/* PKU is not yet implemented for shadow paging. */ if (!tdp_enabled) entry->ecx &= ~F (PKU ); + entry->edx &= kvm_cpuid_7_0_edx_x86_features; + entry->edx &=cpuid_count_edx (7 ,0 ); }else { entry->ebx =0 ; entry->ecx =0 ; + entry->edx =0 ; } entry->eax =0 ; - entry->edx =0 ;break ; }case 9 :
Signature · 1 line
2.7.4