x86: add AVX512_4VNNIW and AVX512_4FMAPS features

The spec can be found in Intel Software Developer Manual or in
Instruction Set Extensions Programming Reference.

Backports commit 95ea69fb46266aaa46d0c8b7f0ba8c4903dbe4e3 from qemu
This commit is contained in:
Luwei Kang 2018-03-01 08:48:15 -05:00 committed by Lioncash
parent 1e4154af83
commit 57533d1adc
No known key found for this signature in database
GPG key ID: 4E3C3CC1031BA9C7
2 changed files with 71 additions and 2 deletions

View file

@ -25,7 +25,6 @@
#include "cpu.h"
#include "exec/exec-all.h"
#include "sysemu/cpus.h"
#include "sysemu/kvm.h"
#include "qapi/qmp/qerror.h"
@ -232,6 +231,7 @@ static void x86_cpu_vendor_words2str(char *dst, uint32_t vendor1,
CPUID_7_0_EBX_INVPCID, CPUID_7_0_EBX_RTM,
CPUID_7_0_EBX_RDSEED */
#define TCG_7_0_ECX_FEATURES (CPUID_7_0_ECX_PKU | CPUID_7_0_ECX_OSPKE)
#define TCG_7_0_EDX_FEATURES 0
#define TCG_APM_FEATURES 0
#define TCG_6_EAX_FEATURES CPUID_6_EAX_ARAT
@ -324,6 +324,23 @@ static FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
R_ECX,
TCG_7_0_ECX_FEATURES,
},
// FEAT_7_0_EDX
{
{
NULL, NULL, "avx512-4vnniw", "avx512-4fmaps",
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
},
7,
true, 0,
R_EDX,
TCG_7_0_EDX_FEATURES,
},
/* Feature names that are already defined on feature_name[] but
* are set on CPUID[8000_0001].EDX on AMD CPUs don't have their
* names on feat_names below. They are copied automatically
@ -866,6 +883,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
0,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
// FEAT_8000_0001_EDX
CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
// FEAT_8000_0001_ECX
@ -891,6 +910,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
0,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
// FEAT_8000_0001_EDX
CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX |
CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_MMXEXT |
@ -940,6 +961,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
0,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
// FEAT_8000_0001_EDX
CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
// FEAT_8000_0001_ECX
@ -965,6 +988,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
0,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
/* Missing: CPUID_EXT2_PDPE1GB, CPUID_EXT2_RDTSCP */
// FEAT_8000_0001_EDX
CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
@ -1005,6 +1030,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
0,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
// FEAT_8000_0001_EDX
// FEAT_8000_0001_ECX
0,
@ -1030,6 +1057,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
0,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
// FEAT_8000_0001_EDX
CPUID_EXT2_NX,
},
@ -1090,6 +1119,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
0,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
// FEAT_8000_0001_EDX
CPUID_EXT2_MMXEXT | CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT,
},
@ -1116,6 +1147,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
0,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
// FEAT_8000_0001_EDX
CPUID_EXT2_NX,
// FEAT_8000_0001_ECX
@ -1141,6 +1174,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
0,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
// FEAT_8000_0001_EDX
CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
// FEAT_8000_0001_ECX
@ -1167,6 +1202,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
0,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
// FEAT_8000_0001_EDX
CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
// FEAT_8000_0001_ECX
@ -1193,6 +1230,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
0,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
// FEAT_8000_0001_EDX
CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
// FEAT_8000_0001_ECX
@ -1220,6 +1259,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
0,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
// FEAT_8000_0001_EDX
CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
// FEAT_8000_0001_ECX
@ -1267,6 +1308,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
0,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
// FEAT_8000_0001_EDX
CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
CPUID_EXT2_SYSCALL,
@ -1316,6 +1359,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
CPUID_7_0_EBX_ERMS,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
// FEAT_8000_0001_EDX
CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
CPUID_EXT2_SYSCALL,
@ -1367,6 +1412,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
// FEAT_8000_0001_EDX
CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
CPUID_EXT2_SYSCALL,
@ -1419,6 +1466,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
CPUID_7_0_EBX_RTM,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
// FEAT_8000_0001_EDX
CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
CPUID_EXT2_SYSCALL,
@ -1472,6 +1521,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
CPUID_7_0_EBX_SMAP,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
// FEAT_8000_0001_EDX
CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
CPUID_EXT2_SYSCALL,
@ -1525,6 +1576,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
CPUID_7_0_EBX_SMAP,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
// FEAT_8000_0001_EDX
CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
CPUID_EXT2_SYSCALL,
@ -1578,6 +1631,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_MPX,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
// FEAT_8000_0001_EDX
CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
CPUID_EXT2_SYSCALL,
@ -1629,6 +1684,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
0,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
// FEAT_8000_0001_EDX
CPUID_EXT2_LM | CPUID_EXT2_FXSR | CPUID_EXT2_MMX |
CPUID_EXT2_NX | CPUID_EXT2_PSE36 | CPUID_EXT2_PAT |
@ -1657,6 +1714,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
0,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
// FEAT_8000_0001_EDX
CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_FXSR |
CPUID_EXT2_MMX | CPUID_EXT2_NX | CPUID_EXT2_PSE36 |
@ -1689,6 +1748,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
0,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
// FEAT_8000_0001_EDX
CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_FXSR |
CPUID_EXT2_MMX | CPUID_EXT2_NX | CPUID_EXT2_PSE36 |
@ -1724,6 +1785,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
0,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
// FEAT_8000_0001_EDX
CPUID_EXT2_LM | CPUID_EXT2_RDTSCP |
CPUID_EXT2_PDPE1GB | CPUID_EXT2_FXSR | CPUID_EXT2_MMX |
@ -1761,6 +1824,8 @@ static X86CPUDefinition builtin_x86_defs[] = {
0,
// FEAT_7_0_ECX
0,
// FEAT_7_0_EDX
0,
// FEAT_8000_0001_EDX
CPUID_EXT2_LM | CPUID_EXT2_RDTSCP |
CPUID_EXT2_PDPE1GB | CPUID_EXT2_FXSR | CPUID_EXT2_MMX |
@ -2543,7 +2608,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
if ((*ecx & CPUID_7_0_ECX_PKU) && env->cr[4] & CR4_PKE_MASK) {
*ecx |= CPUID_7_0_ECX_OSPKE;
}
*edx = 0; /* Reserved */
*edx = env->features[FEAT_7_0_EDX]; /* Feature flags */
} else {
*eax = 0;
*ebx = 0;

View file

@ -441,6 +441,7 @@ typedef enum FeatureWord {
FEAT_1_ECX, /* CPUID[1].ECX */
FEAT_7_0_EBX, /* CPUID[EAX=7,ECX=0].EBX */
FEAT_7_0_ECX, /* CPUID[EAX=7,ECX=0].ECX */
FEAT_7_0_EDX, /* CPUID[EAX=7,ECX=0].EDX */
FEAT_8000_0001_EDX, /* CPUID[8000_0001].EDX */
FEAT_8000_0001_ECX, /* CPUID[8000_0001].ECX */
FEAT_8000_0007_EDX, /* CPUID[8000_0007].EDX */
@ -627,6 +628,9 @@ typedef uint32_t FeatureWordArray[FEATURE_WORDS];
#define CPUID_7_0_ECX_OSPKE (1U << 4)
#define CPUID_7_0_ECX_RDPID (1U << 22)
#define CPUID_7_0_EDX_AVX512_4VNNIW (1U << 2) /* AVX512 Neural Network Instructions */
#define CPUID_7_0_EDX_AVX512_4FMAPS (1U << 3) /* AVX512 Multiply Accumulation Single Precision */
#define CPUID_XSAVE_XSAVEOPT (1U << 0)
#define CPUID_XSAVE_XSAVEC (1U << 1)
#define CPUID_XSAVE_XGETBV1 (1U << 2)