mirror of
https://github.com/xen-project/xen.git
synced 2026-10-30 03:00:05 +01:00
x86/cpuid: Add AVX512_4VNNIW and AVX512_4FMAPS support
Add two new AVX512 subfeatures support for guest. AVX512_4VNNIW: Vector instructions for deep learning enhanced word variable precision. AVX512_4FMAPS: Vector instructions for deep learning floating-point single precision. Signed-off-by: Luwei Kang <luwei.kang@intel.com> Signed-off-by: He Chen <he.chen@linux.intel.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com> Acked-by: Wei Liu <wei.liu2@citrix.com>
This commit is contained in:
1 parent
da2209921e
commit
a0b4216179
9 files changed
+28
-7
No files matched your search
@@ -547,13 +547,15 @@ static void xc_cpuid_hvm_policy(xc_interface *xch,
|
||||
{
|
||||
regs[1] = info->featureset[featureword_of(X86_FEATURE_FSGSBASE)];
|
||||
regs[2] = info->featureset[featureword_of(X86_FEATURE_PREFETCHWT1)];
|
||||
regs[3] = info->featureset[featureword_of(X86_FEATURE_AVX512_4VNNIW)];
|
||||
}
|
||||
else
|
||||
{
|
||||
regs[1] = 0;
|
||||
regs[2] = 0;
|
||||
regs[3] = 0;
|
||||
}
|
||||
regs[0] = regs[3] = 0;
|
||||
regs[0] = 0;
|
||||
break;
|
||||
|
||||
case 0x0000000d:
|
||||
@@ -638,13 +640,15 @@ static void xc_cpuid_pv_policy(xc_interface *xch,
|
||||
{
|
||||
regs[1] = info->featureset[featureword_of(X86_FEATURE_FSGSBASE)];
|
||||
regs[2] = info->featureset[featureword_of(X86_FEATURE_PREFETCHWT1)];
|
||||
regs[3] = info->featureset[featureword_of(X86_FEATURE_AVX512_4VNNIW)];
|
||||
}
|
||||
else
|
||||
{
|
||||
regs[1] = 0;
|
||||
regs[2] = 0;
|
||||
regs[3] = 0;
|
||||
}
|
||||
regs[0] = regs[3] = 0;
|
||||
regs[0] = 0;
|
||||
break;
|
||||
|
||||
case 0x0000000d:
|
||||
|
||||
@@ -143,6 +143,15 @@ static const char *str_e8b[32] =
|
||||
[1 ... 31] = "REZ",
|
||||
};
|
||||
|
||||
static const char *str_7d0[32] =
|
||||
{
|
||||
[0 ... 1] = "REZ",
|
||||
|
||||
[ 2] = "avx512_4vnniw", [ 3] = "avx512_4fmaps",
|
||||
|
||||
[4 ... 31] = "REZ",
|
||||
};
|
||||
|
||||
static struct {
|
||||
const char *name;
|
||||
const char *abbr;
|
||||
@@ -158,6 +167,7 @@ static struct {
|
||||
{ "0x00000007:0.ecx", "7c0", str_7c0 },
|
||||
{ "0x80000007.edx", "e7d", str_e7d },
|
||||
{ "0x80000008.ebx", "e8b", str_e8b },
|
||||
{ "0x00000007:0.edx", "7d0", str_7d0 },
|
||||
};
|
||||
|
||||
#define COL_ALIGN "18"
|
||||
|
||||
@@ -325,7 +325,7 @@ static void generic_identify(struct cpuinfo_x86 *c)
|
||||
cpuid_count(0x00000007, 0, &tmp,
|
||||
&c->x86_capability[cpufeat_word(X86_FEATURE_FSGSBASE)],
|
||||
&c->x86_capability[cpufeat_word(X86_FEATURE_PKU)],
|
||||
&tmp);
|
||||
&c->x86_capability[cpufeat_word(X86_FEATURE_AVX512_4VNNIW)]);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -78,7 +78,7 @@ static void __init calculate_raw_featureset(void)
|
||||
cpuid_count(0x7, 0, &tmp,
|
||||
&raw_featureset[FEATURESET_7b0],
|
||||
&raw_featureset[FEATURESET_7c0],
|
||||
&tmp);
|
||||
&raw_featureset[FEATURESET_7d0]);
|
||||
if ( max >= 0xd )
|
||||
cpuid_count(0xd, 1,
|
||||
&raw_featureset[FEATURESET_Da1],
|
||||
|
||||
@@ -3525,6 +3525,7 @@ void hvm_cpuid(unsigned int input, unsigned int *eax, unsigned int *ebx,
|
||||
special_features[FEATURESET_7b0]);
|
||||
|
||||
*ecx &= hvm_featureset[FEATURESET_7c0];
|
||||
*edx &= hvm_featureset[FEATURESET_7d0];
|
||||
|
||||
/* Don't expose HAP-only features to non-hap guests. */
|
||||
if ( !hap_enabled(d) )
|
||||
|
||||
@@ -1133,6 +1133,7 @@ void pv_cpuid(struct cpu_user_regs *regs)
|
||||
special_features[FEATURESET_7b0]);
|
||||
|
||||
c &= pv_featureset[FEATURESET_7c0];
|
||||
d &= pv_featureset[FEATURESET_7d0];
|
||||
|
||||
if ( !is_pvh_domain(currd) )
|
||||
{
|
||||
@@ -1147,8 +1148,8 @@ void pv_cpuid(struct cpu_user_regs *regs)
|
||||
}
|
||||
}
|
||||
else
|
||||
b = c = 0;
|
||||
a = d = 0;
|
||||
b = c = d = 0;
|
||||
a = 0;
|
||||
break;
|
||||
|
||||
case XSTATE_CPUID:
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#define FEATURESET_7c0 6 /* 0x00000007:0.ecx */
|
||||
#define FEATURESET_e7d 7 /* 0x80000007.edx */
|
||||
#define FEATURESET_e8b 8 /* 0x80000008.ebx */
|
||||
#define FEATURESET_7d0 9 /* 0x00000007:0.edx */
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <xen/types.h>
|
||||
|
||||
@@ -234,6 +234,10 @@ XEN_CPUFEATURE(EFRO, 7*32+10) /* APERF/MPERF Read Only interface */
|
||||
/* AMD-defined CPU features, CPUID level 0x80000008.ebx, word 8 */
|
||||
XEN_CPUFEATURE(CLZERO, 8*32+ 0) /*A CLZERO instruction */
|
||||
|
||||
/* Intel-defined CPU features, CPUID level 0x00000007:0.edx, word 9 */
|
||||
XEN_CPUFEATURE(AVX512_4VNNIW, 9*32+ 2) /*A AVX512 Neural Network Instructions */
|
||||
XEN_CPUFEATURE(AVX512_4FMAPS, 9*32+ 3) /*A AVX512 Multiply Accumulation Single Precision */
|
||||
|
||||
#endif /* XEN_CPUFEATURE */
|
||||
|
||||
/* Clean up from a default include. Close the enum (for C). */
|
||||
|
||||
@@ -253,7 +253,7 @@ def crunch_numbers(state):
|
||||
# 512bit registers, and the instructions themselves. All further AVX512 features
|
||||
# are built on top of AVX512F
|
||||
AVX512F: [AVX512DQ, AVX512IFMA, AVX512PF, AVX512ER, AVX512CD,
|
||||
AVX512BW, AVX512VL, AVX512VBMI],
|
||||
AVX512BW, AVX512VL, AVX512VBMI, AVX512_4VNNIW, AVX512_4FMAPS],
|
||||
}
|
||||
|
||||
deep_features = tuple(sorted(deps.keys()))
|
||||
|
||||