On 5/12/20 12:28 PM, Sean Christopherson wrote: > On Tue, May 12, 2020 at 09:58:19AM -0700, Jim Mattson wrote: >> On Tue, May 12, 2020 at 8:12 AM Babu Moger <babu.moger@xxxxxxx> wrote: >>> >>> >>> >>> On 5/11/20 6:51 PM, Jim Mattson wrote: >>>> On Mon, May 11, 2020 at 4:33 PM Babu Moger <babu.moger@xxxxxxx> wrote: >>>>> >>>>> Both Intel and AMD support (MPK) Memory Protection Key feature. >>>>> Move the feature detection from VMX to the common code. It should >>>>> work for both the platforms now. >>>>> >>>>> Signed-off-by: Babu Moger <babu.moger@xxxxxxx> >>>>> --- >>>>> arch/x86/kvm/cpuid.c | 4 +++- >>>>> arch/x86/kvm/vmx/vmx.c | 4 ---- >>>>> 2 files changed, 3 insertions(+), 5 deletions(-) >>>>> >>>>> diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c >>>>> index 901cd1fdecd9..3da7d6ea7574 100644 >>>>> --- a/arch/x86/kvm/cpuid.c >>>>> +++ b/arch/x86/kvm/cpuid.c >>>>> @@ -278,6 +278,8 @@ void kvm_set_cpu_caps(void) >>>>> #ifdef CONFIG_X86_64 >>>>> unsigned int f_gbpages = F(GBPAGES); >>>>> unsigned int f_lm = F(LM); >>>>> + /* PKU is not yet implemented for shadow paging. */ >>>>> + unsigned int f_pku = tdp_enabled ? F(PKU) : 0; >>>> >>>> I think we still want to require that OSPKE be set on the host before >>>> exposing PKU to the guest. >>>> >>> >>> Ok I can add this check. >>> >>> + unsigned int f_pku = tdp_enabled && F(OSPKE)? F(PKU) : 0; >> >> That doesn't do what you think it does. F(OSPKE) is a non-zero >> constant, so that conjunct is always true. > > My vote would be to omit f_pku and adjust the cap directly, e.g. Sure. I am fine with this. Thanks > > diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c > index 6828be99b9083..998c902df9e57 100644 > --- a/arch/x86/kvm/cpuid.c > +++ b/arch/x86/kvm/cpuid.c > @@ -326,7 +326,7 @@ void kvm_set_cpu_caps(void) > ); > > kvm_cpu_cap_mask(CPUID_7_ECX, > - F(AVX512VBMI) | F(LA57) | 0 /*PKU*/ | 0 /*OSPKE*/ | F(RDPID) | > + F(AVX512VBMI) | F(LA57) | F(PKU) | 0 /*OSPKE*/ | F(RDPID) | > F(AVX512_VPOPCNTDQ) | F(UMIP) | F(AVX512_VBMI2) | F(GFNI) | > F(VAES) | F(VPCLMULQDQ) | F(AVX512_VNNI) | F(AVX512_BITALG) | > F(CLDEMOTE) | F(MOVDIRI) | F(MOVDIR64B) | 0 /*WAITPKG*/ > @@ -334,6 +334,8 @@ void kvm_set_cpu_caps(void) > /* Set LA57 based on hardware capability. */ > if (cpuid_ecx(7) & F(LA57)) > kvm_cpu_cap_set(X86_FEATURE_LA57); > + if (!tdp_enabled || !boot_cpu_has(OSPKE)) > + kvm_cpu_cap_clear(X86_FEATURE_PKU); > > kvm_cpu_cap_mask(CPUID_7_EDX, > F(AVX512_4VNNIW) | F(AVX512_4FMAPS) | F(SPEC_CTRL) | >