KVM: x86: Move MPK feature detection to common code
authorBabu Moger <babu.moger@amd.com>
Tue, 12 May 2020 23:59:16 +0000 (18:59 -0500)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 4 Jun 2020 16:35:06 +0000 (12:35 -0400)
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@amd.com>
Message-Id: <158932795627.44260.15144185478040178638.stgit@naples-babu.amd.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/cpuid.c
arch/x86/kvm/vmx/vmx.c

index 3d88ddf781d0d95537d30fb2fb862fea90820e83..9ca32d96993887707d3b39c33da21df74394be38 100644 (file)
@@ -325,7 +325,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,13 @@ void kvm_set_cpu_caps(void)
        if (cpuid_ecx(7) & F(LA57))
                kvm_cpu_cap_set(X86_FEATURE_LA57);
 
+       /*
+        * PKU not yet implemented for shadow paging and requires OSPKE
+        * to be set on the host. Clear it if that is not the case
+        */
+       if (!tdp_enabled || !boot_cpu_has(X86_FEATURE_OSPKE))
+               kvm_cpu_cap_clear(X86_FEATURE_PKU);
+
        kvm_cpu_cap_mask(CPUID_7_EDX,
                F(AVX512_4VNNIW) | F(AVX512_4FMAPS) | F(SPEC_CTRL) |
                F(SPEC_CTRL_SSBD) | F(ARCH_CAPABILITIES) | F(INTEL_STIBP) |
index 170cc76a581f4a0ef186bff2e42a078ab7ca2b50..0e4f7ff54e6a43b7fc09535b010733ee6ca215ab 100644 (file)
@@ -7282,10 +7282,6 @@ static __init void vmx_set_cpu_caps(void)
        if (vmx_pt_mode_is_host_guest())
                kvm_cpu_cap_check_and_set(X86_FEATURE_INTEL_PT);
 
-       /* PKU is not yet implemented for shadow paging. */
-       if (enable_ept && boot_cpu_has(X86_FEATURE_OSPKE))
-               kvm_cpu_cap_check_and_set(X86_FEATURE_PKU);
-
        if (vmx_umip_emulated())
                kvm_cpu_cap_set(X86_FEATURE_UMIP);