]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
tools: add a kernel-chktaint to tools/debugging
authorThorsten Leemhuis <linux@leemhuis.info>
Tue, 8 Jan 2019 19:40:06 +0000 (20:40 +0100)
committerJonathan Corbet <corbet@lwn.net>
Tue, 8 Jan 2019 23:29:52 +0000 (16:29 -0700)
Add a script to the tools/ directory that shows if or why the running
kernel was tainted. The script was mostly written by Randy Dunlap; I
enhanced the script a bit.  There does not appear to be a good home for
this script. so create tools/debugging for tools of this nature.

Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
Signed-off-by: Thorsten Leemhuis <linux@leemhuis.info>
[ jc: fixed conflicts, rewrote changelog ]
Signed-off-by: Jonathan Corbet <corbet@lwn.net>
tools/Makefile
tools/debugging/Makefile [new file with mode: 0644]
tools/debugging/kernel-chktaint [new file with mode: 0755]

index abb358a70ad0bdb8af9d44a6e7a1dcb8906ed3c8..c0d1e59f5abbfb259dce3015a61d7c1fc0ff6d41 100644 (file)
@@ -12,6 +12,7 @@ help:
        @echo '  acpi                   - ACPI tools'
        @echo '  cgroup                 - cgroup tools'
        @echo '  cpupower               - a tool for all things x86 CPU power'
+       @echo '  debugging              - tools for debugging'
        @echo '  firewire               - the userspace part of nosy, an IEEE-1394 traffic sniffer'
        @echo '  freefall               - laptop accelerometer program for disk protection'
        @echo '  gpio                   - GPIO tools'
@@ -60,7 +61,7 @@ acpi: FORCE
 cpupower: FORCE
        $(call descend,power/$@)
 
-cgroup firewire hv guest spi usb virtio vm bpf iio gpio objtool leds wmi pci: FORCE
+cgroup firewire hv guest spi usb virtio vm bpf iio gpio objtool leds wmi pci debugging: FORCE
        $(call descend,$@)
 
 liblockdep: FORCE
@@ -95,7 +96,8 @@ kvm_stat: FORCE
 all: acpi cgroup cpupower gpio hv firewire liblockdep \
                perf selftests spi turbostat usb \
                virtio vm bpf x86_energy_perf_policy \
-               tmon freefall iio objtool kvm_stat wmi pci
+               tmon freefall iio objtool kvm_stat wmi \
+               pci debugging
 
 acpi_install:
        $(call descend,power/$(@:_install=),install)
@@ -103,7 +105,7 @@ acpi_install:
 cpupower_install:
        $(call descend,power/$(@:_install=),install)
 
-cgroup_install firewire_install gpio_install hv_install iio_install perf_install spi_install usb_install virtio_install vm_install bpf_install objtool_install wmi_install pci_install:
+cgroup_install firewire_install gpio_install hv_install iio_install perf_install spi_install usb_install virtio_install vm_install bpf_install objtool_install wmi_install pci_install debugging_install:
        $(call descend,$(@:_install=),install)
 
 liblockdep_install:
@@ -129,7 +131,7 @@ install: acpi_install cgroup_install cpupower_install gpio_install \
                perf_install selftests_install turbostat_install usb_install \
                virtio_install vm_install bpf_install x86_energy_perf_policy_install \
                tmon_install freefall_install objtool_install kvm_stat_install \
-               wmi_install pci_install
+               wmi_install pci_install debugging_install
 
 acpi_clean:
        $(call descend,power/acpi,clean)
@@ -137,7 +139,7 @@ acpi_clean:
 cpupower_clean:
        $(call descend,power/cpupower,clean)
 
-cgroup_clean hv_clean firewire_clean spi_clean usb_clean virtio_clean vm_clean wmi_clean bpf_clean iio_clean gpio_clean objtool_clean leds_clean pci_clean:
+cgroup_clean hv_clean firewire_clean spi_clean usb_clean virtio_clean vm_clean wmi_clean bpf_clean iio_clean gpio_clean objtool_clean leds_clean pci_clean debugging_clean:
        $(call descend,$(@:_clean=),clean)
 
 liblockdep_clean:
@@ -175,6 +177,6 @@ clean: acpi_clean cgroup_clean cpupower_clean hv_clean firewire_clean \
                perf_clean selftests_clean turbostat_clean spi_clean usb_clean virtio_clean \
                vm_clean bpf_clean iio_clean x86_energy_perf_policy_clean tmon_clean \
                freefall_clean build_clean libbpf_clean libsubcmd_clean liblockdep_clean \
-               gpio_clean objtool_clean leds_clean wmi_clean pci_clean
+               gpio_clean objtool_clean leds_clean wmi_clean pci_clean debugging_clean
 
 .PHONY: FORCE
diff --git a/tools/debugging/Makefile b/tools/debugging/Makefile
new file mode 100644 (file)
index 0000000..e2b7c1a
--- /dev/null
@@ -0,0 +1,16 @@
+# SPDX-License-Identifier: GPL-2.0
+# Makefile for debugging tools
+
+PREFIX ?= /usr
+BINDIR ?= bin
+INSTALL ?= install
+
+TARGET = kernel-chktaint
+
+all: $(TARGET)
+
+clean:
+
+install: kernel-chktaint
+       $(INSTALL) -D -m 755 $(TARGET) $(DESTDIR)$(PREFIX)/$(BINDIR)/$(TARGET)
+
diff --git a/tools/debugging/kernel-chktaint b/tools/debugging/kernel-chktaint
new file mode 100755 (executable)
index 0000000..2240cb5
--- /dev/null
@@ -0,0 +1,202 @@
+#! /bin/sh
+# SPDX-License-Identifier: GPL-2.0
+#
+# Randy Dunlap <rdunlap@infradead.org>, 2018
+# Thorsten Leemhuis <linux@leemhuis.info>, 2018
+
+usage()
+{
+       cat <<EOF
+usage: ${0##*/}
+       ${0##*/} <int>
+
+Call without parameters to decode /proc/sys/kernel/tainted.
+
+Call with a positive integer as parameter to decode a value you
+retrieved from /proc/sys/kernel/tainted on another system.
+
+EOF
+}
+
+if [ "$1"x != "x" ]; then
+       if  [ "$1"x == "--helpx" ] || [ "$1"x == "-hx" ] ; then
+               usage
+               exit 1
+       elif  [ $1 -ge 0 ] 2>/dev/null ; then
+               taint=$1
+       else
+               echo "Error: Parameter '$1' not a positive interger. Aborting." >&2
+               exit 1
+       fi
+else
+       TAINTFILE="/proc/sys/kernel/tainted"
+       if [ ! -r $TAINTFILE ]; then
+               echo "No file: $TAINTFILE"
+               exit
+       fi
+
+       taint=`cat $TAINTFILE`
+fi
+
+if [ $taint -eq 0 ]; then
+       echo "Kernel not Tainted"
+       exit
+else
+       echo "Kernel is \"tainted\" for the following reasons:"
+fi
+
+T=$taint
+out=
+
+addout() {
+       out=$out$1
+}
+
+if [ `expr $T % 2` -eq 0 ]; then
+       addout "G"
+else
+       addout "P"
+       echo " * proprietary module was loaded (#0)"
+fi
+
+T=`expr $T / 2`
+if [ `expr $T % 2` -eq 0 ]; then
+       addout " "
+else
+       addout "F"
+       echo " * module was force loaded (#1)"
+fi
+
+T=`expr $T / 2`
+if [ `expr $T % 2` -eq 0 ]; then
+       addout " "
+else
+       addout "S"
+       echo " * SMP kernel oops on an officially SMP incapable processor (#2)"
+fi
+
+T=`expr $T / 2`
+if [ `expr $T % 2` -eq 0 ]; then
+       addout " "
+else
+       addout "R"
+       echo " * module was force unloaded (#3)"
+fi
+
+T=`expr $T / 2`
+if [ `expr $T % 2` -eq 0 ]; then
+       addout " "
+else
+       addout "M"
+       echo " * processor reported a Machine Check Exception (MCE) (#4)"
+fi
+
+T=`expr $T / 2`
+if [ `expr $T % 2` -eq 0 ]; then
+       addout " "
+else
+       addout "B"
+       echo " * bad page referenced or some unexpected page flags (#5)"
+fi
+
+T=`expr $T / 2`
+if [ `expr $T % 2` -eq 0 ]; then
+       addout " "
+else
+       addout "U"
+       echo " * taint requested by userspace application (#6)"
+fi
+
+T=`expr $T / 2`
+if [ `expr $T % 2` -eq 0 ]; then
+       addout " "
+else
+       addout "D"
+       echo " * kernel died recently, i.e. there was an OOPS or BUG (#7)"
+fi
+
+T=`expr $T / 2`
+if [ `expr $T % 2` -eq 0 ]; then
+       addout " "
+else
+       addout "A"
+       echo " * an ACPI table was overridden by user (#8)"
+fi
+
+T=`expr $T / 2`
+if [ `expr $T % 2` -eq 0 ]; then
+       addout " "
+else
+       addout "W"
+       echo " * kernel issued warning (#9)"
+fi
+
+T=`expr $T / 2`
+if [ `expr $T % 2` -eq 0 ]; then
+       addout " "
+else
+       addout "C"
+       echo " * staging driver was loaded (#10)"
+fi
+
+T=`expr $T / 2`
+if [ `expr $T % 2` -eq 0 ]; then
+       addout " "
+else
+       addout "I"
+       echo " * workaround for bug in platform firmware applied (#11)"
+fi
+
+T=`expr $T / 2`
+if [ `expr $T % 2` -eq 0 ]; then
+       addout " "
+else
+       addout "O"
+       echo " * externally-built ('out-of-tree') module was loaded  (#12)"
+fi
+
+T=`expr $T / 2`
+if [ `expr $T % 2` -eq 0 ]; then
+       addout " "
+else
+       addout "E"
+       echo " * unsigned module was loaded (#13)"
+fi
+
+T=`expr $T / 2`
+if [ `expr $T % 2` -eq 0 ]; then
+       addout " "
+else
+       addout "L"
+       echo " * soft lockup occurred (#14)"
+fi
+
+T=`expr $T / 2`
+if [ `expr $T % 2` -eq 0 ]; then
+       addout " "
+else
+       addout "K"
+       echo " * kernel has been live patched (#15)"
+fi
+
+T=`expr $T / 2`
+if [ `expr $T % 2` -eq 0 ]; then
+       addout " "
+else
+       addout "X"
+       echo " * auxiliary taint, defined for and used by distros (#16)"
+
+fi
+T=`expr $T / 2`
+if [ `expr $T % 2` -eq 0 ]; then
+       addout " "
+else
+       addout "T"
+       echo " * kernel was built with the struct randomization plugin (#17)"
+fi
+
+echo "For a more detailed explanation of the various taint flags see"
+echo " Documentation/admin-guide/tainted-kernels.rst in the the Linux kernel sources"
+echo " or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html"
+echo "Raw taint value as int/string: $taint/'$out'"
+#EOF#