x86/alternatives: Catch late X86_FEATURE modifiers
authorBorislav Petkov (AMD) <bp@alien8.de>
Wed, 27 Mar 2024 15:43:14 +0000 (16:43 +0100)
committerBorislav Petkov (AMD) <bp@alien8.de>
Tue, 9 Apr 2024 16:03:53 +0000 (18:03 +0200)
After alternatives have been patched, changes to the X86_FEATURE flags
won't take effect and could potentially even be wrong.

Warn about it.

This is something which has been long overdue.

Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Tested-by: Srikanth Aithal <sraithal@amd.com>
Link: https://lore.kernel.org/r/20240327154317.29909-3-bp@alien8.de
arch/x86/include/asm/cpufeature.h
arch/x86/kernel/cpu/cpuid-deps.c

index 686e92d2663eeeacd90a46568ae37b3db76b9e00..f07687ddb13d83e85a8c1d9bc9f76ee44e1b6938 100644 (file)
@@ -150,8 +150,12 @@ extern const char * const x86_bug_flags[NBUGINTS*32];
 extern void setup_clear_cpu_cap(unsigned int bit);
 extern void clear_cpu_cap(struct cpuinfo_x86 *c, unsigned int bit);
 
-#define setup_force_cpu_cap(bit) do { \
-       set_cpu_cap(&boot_cpu_data, bit);       \
+#define setup_force_cpu_cap(bit) do {                  \
+                                                       \
+       if (!boot_cpu_has(bit))                         \
+               WARN_ON(alternatives_patched);          \
+                                                       \
+       set_cpu_cap(&boot_cpu_data, bit);               \
        set_bit(bit, (unsigned long *)cpu_caps_set);    \
 } while (0)
 
index b7174209d855c634a701aaf489372b087f464006..5dd427c6feb2e8e9ddfc40465925a046607bad11 100644 (file)
@@ -114,6 +114,9 @@ static void do_clear_cpu_cap(struct cpuinfo_x86 *c, unsigned int feature)
        if (WARN_ON(feature >= MAX_FEATURE_BITS))
                return;
 
+       if (boot_cpu_has(feature))
+               WARN_ON(alternatives_patched);
+
        clear_feature(c, feature);
 
        /* Collect all features to disable, handling dependencies */