Message ID | 20191011074103.30393-2-tao3.xu@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | x86: Enable user wait instructions | expand |
On 10/11/2019 3:41 PM, Xu, Tao3 wrote: [...] > diff --git a/target/i386/kvm.c b/target/i386/kvm.c > index 11b9c854b5..a465c893b5 100644 > --- a/target/i386/kvm.c > +++ b/target/i386/kvm.c > @@ -401,6 +401,12 @@ uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function, > if (host_tsx_blacklisted()) { > ret &= ~(CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_HLE); > } > + } else if (function == 7 && index == 0 && reg == R_ECX) { > + if (enable_cpu_pm) { > + ret |= CPUID_7_0_ECX_WAITPKG; > + } else { > + ret &= ~CPUID_7_0_ECX_WAITPKG; > + } Hi Paolo, I am sorry because I realize in KVM side, I keep cpuid mask WAITPKG as 0: F(CLDEMOTE) | F(MOVDIRI) | F(MOVDIR64B) | 0 /*WAITPKG*/; Therefore in QEMU side, we need to add CPUID_7_0_ECX_WAITPKG when enable_cpu_pm is on. Otherwise, QEMU can't get this CPUID. Could you review this part again? Thank you very much! Tao
Hi Paolo, Ping :) On 10/11/2019 3:49 PM, Tao Xu wrote: > On 10/11/2019 3:41 PM, Xu, Tao3 wrote: > [...] >> diff --git a/target/i386/kvm.c b/target/i386/kvm.c >> index 11b9c854b5..a465c893b5 100644 >> --- a/target/i386/kvm.c >> +++ b/target/i386/kvm.c >> @@ -401,6 +401,12 @@ uint32_t kvm_arch_get_supported_cpuid(KVMState >> *s, uint32_t function, >> if (host_tsx_blacklisted()) { >> ret &= ~(CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_HLE); >> } >> + } else if (function == 7 && index == 0 && reg == R_ECX) { >> + if (enable_cpu_pm) { >> + ret |= CPUID_7_0_ECX_WAITPKG; >> + } else { >> + ret &= ~CPUID_7_0_ECX_WAITPKG; >> + } > > Hi Paolo, > > I am sorry because I realize in KVM side, I keep cpuid mask WAITPKG as 0: > > F(CLDEMOTE) | F(MOVDIRI) | F(MOVDIR64B) | 0 /*WAITPKG*/; > > Therefore in QEMU side, we need to add CPUID_7_0_ECX_WAITPKG when > enable_cpu_pm is on. Otherwise, QEMU can't get this CPUID. > > Could you review this part again? Thank you very much! > > Tao
diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 44f1bbdcac..5ec1844c1f 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -1058,7 +1058,7 @@ static FeatureWordInfo feature_word_info[FEATURE_WORDS] = { .type = CPUID_FEATURE_WORD, .feat_names = { NULL, "avx512vbmi", "umip", "pku", - NULL /* ospke */, NULL, "avx512vbmi2", NULL, + NULL /* ospke */, "waitpkg", "avx512vbmi2", NULL, "gfni", "vaes", "vpclmulqdq", "avx512vnni", "avx512bitalg", NULL, "avx512-vpopcntdq", NULL, "la57", NULL, NULL, NULL, diff --git a/target/i386/cpu.h b/target/i386/cpu.h index eaa5395aa5..4e3206c8a2 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -701,6 +701,7 @@ typedef uint64_t FeatureWordArray[FEATURE_WORDS]; #define CPUID_7_0_ECX_UMIP (1U << 2) #define CPUID_7_0_ECX_PKU (1U << 3) #define CPUID_7_0_ECX_OSPKE (1U << 4) +#define CPUID_7_0_ECX_WAITPKG (1U << 5) /* UMONITOR/UMWAIT/TPAUSE Instructions */ #define CPUID_7_0_ECX_VBMI2 (1U << 6) /* Additional VBMI Instrs */ #define CPUID_7_0_ECX_GFNI (1U << 8) #define CPUID_7_0_ECX_VAES (1U << 9) diff --git a/target/i386/kvm.c b/target/i386/kvm.c index 11b9c854b5..a465c893b5 100644 --- a/target/i386/kvm.c +++ b/target/i386/kvm.c @@ -401,6 +401,12 @@ uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function, if (host_tsx_blacklisted()) { ret &= ~(CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_HLE); } + } else if (function == 7 && index == 0 && reg == R_ECX) { + if (enable_cpu_pm) { + ret |= CPUID_7_0_ECX_WAITPKG; + } else { + ret &= ~CPUID_7_0_ECX_WAITPKG; + } } else if (function == 7 && index == 0 && reg == R_EDX) { /* * Linux v4.17-v4.20 incorrectly return ARCH_CAPABILITIES on SVM hosts.