x86/cpu: Sanitize X86_FEATURE_OSPKE
[linux-2.6-microblaze.git] / arch / x86 / kernel / cpu / common.c
index f875dea..dbfb335 100644 (file)
@@ -466,22 +466,20 @@ static bool pku_disabled;
 
 static __always_inline void setup_pku(struct cpuinfo_x86 *c)
 {
-       /* check the boot processor, plus compile options for PKU: */
-       if (!cpu_feature_enabled(X86_FEATURE_PKU))
-               return;
-       /* checks the actual processor's cpuid bits: */
-       if (!cpu_has(c, X86_FEATURE_PKU))
-               return;
-       if (pku_disabled)
+       if (c == &boot_cpu_data) {
+               if (pku_disabled || !cpu_feature_enabled(X86_FEATURE_PKU))
+                       return;
+               /*
+                * Setting CR4.PKE will cause the X86_FEATURE_OSPKE cpuid
+                * bit to be set.  Enforce it.
+                */
+               setup_force_cpu_cap(X86_FEATURE_OSPKE);
+
+       } else if (!cpu_feature_enabled(X86_FEATURE_OSPKE)) {
                return;
+       }
 
        cr4_set_bits(X86_CR4_PKE);
-       /*
-        * Setting X86_CR4_PKE will cause the X86_FEATURE_OSPKE
-        * cpuid bit to be set.  We need to ensure that we
-        * update that bit in this CPU's "cpu_info".
-        */
-       set_cpu_cap(c, X86_FEATURE_OSPKE);
 }
 
 #ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS