diff --git a/qemu/target-i386/cpu.c b/qemu/target-i386/cpu.c index c6f2b262..89fb9fef 100644 --- a/qemu/target-i386/cpu.c +++ b/qemu/target-i386/cpu.c @@ -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; diff --git a/qemu/target-i386/cpu.h b/qemu/target-i386/cpu.h index dc2875ae..5093ea14 100644 --- a/qemu/target-i386/cpu.h +++ b/qemu/target-i386/cpu.h @@ -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)