]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
x86/cpufeature: Add bug flags to /proc/cpuinfo
authorBorislav Petkov <bp@suse.de>
Tue, 24 Jun 2014 11:25:03 +0000 (13:25 +0200)
committerBen Hutchings <ben@decadent.org.uk>
Wed, 22 May 2019 22:15:00 +0000 (23:15 +0100)
commit 80a208bd3948aceddf0429bd9f9b4cd858d526df upstream.

Dump the flags which denote we have detected and/or have applied bug
workarounds to the CPU we're executing on, in a similar manner to the
feature flags.

The advantage is that those are not accumulating over time like the CPU
features.

Signed-off-by: Borislav Petkov <bp@suse.de>
Link: http://lkml.kernel.org/r/1403609105-8332-2-git-send-email-bp@alien8.de
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
[bwh: Backported to 3.16: adjust context]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
arch/x86/include/asm/cpufeature.h
arch/x86/kernel/cpu/mkcapflags.sh
arch/x86/kernel/cpu/proc.c

index 9bb2ef93a7dc91de6fedbf99012861cc96e16f2d..b591c44685f89f7acdfd6461e8bbf245d8fab3cc 100644 (file)
 #define X86_BUG_F00F           X86_BUG(0) /* Intel F00F */
 #define X86_BUG_FDIV           X86_BUG(1) /* FPU FDIV */
 #define X86_BUG_COMA           X86_BUG(2) /* Cyrix 6x86 coma */
-#define X86_BUG_AMD_TLB_MMATCH X86_BUG(3) /* AMD Erratum 383 */
-#define X86_BUG_AMD_APIC_C1E   X86_BUG(4) /* AMD Erratum 400 */
+#define X86_BUG_AMD_TLB_MMATCH X86_BUG(3) /* "tlb_mmatch" AMD Erratum 383 */
+#define X86_BUG_AMD_APIC_C1E   X86_BUG(4) /* "apic_c1e" AMD Erratum 400 */
 #define X86_BUG_CPU_MELTDOWN   X86_BUG(5) /* CPU is affected by meltdown attack and needs kernel page table isolation */
 #define X86_BUG_SPECTRE_V1     X86_BUG(6) /* CPU is affected by Spectre variant 1 attack with conditional branches */
 #define X86_BUG_SPECTRE_V2     X86_BUG(7) /* CPU is affected by Spectre variant 2 attack with indirect branches */
 extern const char * const x86_cap_flags[NCAPINTS*32];
 extern const char * const x86_power_flags[32];
 
+/*
+ * In order to save room, we index into this array by doing
+ * X86_BUG_<name> - NCAPINTS*32.
+ */
+extern const char * const x86_bug_flags[NBUGINTS*32];
+
 #define test_cpu_cap(c, bit)                                           \
         test_bit(bit, (unsigned long *)((c)->x86_capability))
 
index 2bf616505499504fa7e1c50108f873a4ea28d909..e2b22df964cd88fc49b4cce67023b1e85122ed66 100644 (file)
@@ -1,23 +1,25 @@
 #!/bin/sh
 #
-# Generate the x86_cap_flags[] array from include/asm/cpufeature.h
+# Generate the x86_cap/bug_flags[] arrays from include/asm/cpufeature.h
 #
 
 IN=$1
 OUT=$2
 
-TABS="$(printf '\t\t\t\t\t')"
-trap 'rm "$OUT"' EXIT
+function dump_array()
+{
+       ARRAY=$1
+       SIZE=$2
+       PFX=$3
+       POSTFIX=$4
 
-(
-       echo "#ifndef _ASM_X86_CPUFEATURE_H"
-       echo "#include <asm/cpufeature.h>"
-       echo "#endif"
-       echo ""
-       echo "const char * const x86_cap_flags[NCAPINTS*32] = {"
+       PFX_SZ=$(echo $PFX | wc -c)
+       TABS="$(printf '\t\t\t\t\t')"
+
+       echo "const char * const $ARRAY[$SIZE] = {"
 
-       # Iterate through any input lines starting with #define X86_FEATURE_
-       sed -n -e 's/\t/ /g' -e 's/^ *# *define *X86_FEATURE_//p' $IN |
+       # Iterate through any input lines starting with #define $PFX
+       sed -n -e 's/\t/ /g' -e "s/^ *# *define *$PFX//p" $IN |
        while read i
        do
                # Name is everything up to the first whitespace
@@ -31,11 +33,32 @@ trap 'rm "$OUT"' EXIT
                # Name is uppercase, VALUE is all lowercase
                VALUE="$(echo "$VALUE" | tr A-Z a-z)"
 
-               TABCOUNT=$(( ( 5*8 - 14 - $(echo "$NAME" | wc -c) ) / 8 ))
-               printf "\t[%s]%.*s = %s,\n" \
-                       "X86_FEATURE_$NAME" "$TABCOUNT" "$TABS" "$VALUE"
+        if [ -n "$POSTFIX" ]; then
+            T=$(( $PFX_SZ + $(echo $POSTFIX | wc -c) + 2 ))
+               TABS="$(printf '\t\t\t\t\t\t')"
+                   TABCOUNT=$(( ( 6*8 - ($T + 1) - $(echo "$NAME" | wc -c) ) / 8 ))
+                   printf "\t[%s - %s]%.*s = %s,\n" "$PFX$NAME" "$POSTFIX" "$TABCOUNT" "$TABS" "$VALUE"
+        else
+                   TABCOUNT=$(( ( 5*8 - ($PFX_SZ + 1) - $(echo "$NAME" | wc -c) ) / 8 ))
+            printf "\t[%s]%.*s = %s,\n" "$PFX$NAME" "$TABCOUNT" "$TABS" "$VALUE"
+        fi
        done
        echo "};"
+}
+
+trap 'rm "$OUT"' EXIT
+
+(
+       echo "#ifndef _ASM_X86_CPUFEATURE_H"
+       echo "#include <asm/cpufeature.h>"
+       echo "#endif"
+       echo ""
+
+       dump_array "x86_cap_flags" "NCAPINTS*32" "X86_FEATURE_" ""
+       echo ""
+
+       dump_array "x86_bug_flags" "NBUGINTS*32" "X86_BUG_" "NCAPINTS*32"
+
 ) > $OUT
 
 trap - EXIT
index 8d9c2afd16c6d9ebd8bb4f77448f13707a7380f8..4af9be1c07ebbded71779f9387e719a8d820597c 100644 (file)
@@ -97,6 +97,14 @@ static int show_cpuinfo(struct seq_file *m, void *v)
                if (cpu_has(c, i) && x86_cap_flags[i] != NULL)
                        seq_printf(m, " %s", x86_cap_flags[i]);
 
+       seq_printf(m, "\nbugs\t\t:");
+       for (i = 0; i < 32*NBUGINTS; i++) {
+               unsigned int bug_bit = 32*NCAPINTS + i;
+
+               if (cpu_has_bug(c, bug_bit) && x86_bug_flags[i])
+                       seq_printf(m, " %s", x86_bug_flags[i]);
+       }
+
        seq_printf(m, "\nbogomips\t: %lu.%02lu\n",
                   c->loops_per_jiffy/(500000/HZ),
                   (c->loops_per_jiffy/(5000/HZ)) % 100);