summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThorsten Leemhuis <linux@leemhuis.info>2019-01-08 14:40:06 -0500
committerJonathan Corbet <corbet@lwn.net>2019-01-08 18:29:52 -0500
commit4ab5a5d2a4a2289c2af07accbec7170ca5671f41 (patch)
treeca2eeac3a029e810e3ddc65675658bf8db5d5ce4
parent8fe28cb58bcb235034b64cbbb7550a8a43fd88be (diff)
tools: add a kernel-chktaint to tools/debugging
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>
-rw-r--r--tools/Makefile14
-rw-r--r--tools/debugging/Makefile16
-rwxr-xr-xtools/debugging/kernel-chktaint202
3 files changed, 226 insertions, 6 deletions
diff --git a/tools/Makefile b/tools/Makefile
index abb358a70ad0..c0d1e59f5abb 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -12,6 +12,7 @@ help:
12 @echo ' acpi - ACPI tools' 12 @echo ' acpi - ACPI tools'
13 @echo ' cgroup - cgroup tools' 13 @echo ' cgroup - cgroup tools'
14 @echo ' cpupower - a tool for all things x86 CPU power' 14 @echo ' cpupower - a tool for all things x86 CPU power'
15 @echo ' debugging - tools for debugging'
15 @echo ' firewire - the userspace part of nosy, an IEEE-1394 traffic sniffer' 16 @echo ' firewire - the userspace part of nosy, an IEEE-1394 traffic sniffer'
16 @echo ' freefall - laptop accelerometer program for disk protection' 17 @echo ' freefall - laptop accelerometer program for disk protection'
17 @echo ' gpio - GPIO tools' 18 @echo ' gpio - GPIO tools'
@@ -60,7 +61,7 @@ acpi: FORCE
60cpupower: FORCE 61cpupower: FORCE
61 $(call descend,power/$@) 62 $(call descend,power/$@)
62 63
63cgroup firewire hv guest spi usb virtio vm bpf iio gpio objtool leds wmi pci: FORCE 64cgroup firewire hv guest spi usb virtio vm bpf iio gpio objtool leds wmi pci debugging: FORCE
64 $(call descend,$@) 65 $(call descend,$@)
65 66
66liblockdep: FORCE 67liblockdep: FORCE
@@ -95,7 +96,8 @@ kvm_stat: FORCE
95all: acpi cgroup cpupower gpio hv firewire liblockdep \ 96all: acpi cgroup cpupower gpio hv firewire liblockdep \
96 perf selftests spi turbostat usb \ 97 perf selftests spi turbostat usb \
97 virtio vm bpf x86_energy_perf_policy \ 98 virtio vm bpf x86_energy_perf_policy \
98 tmon freefall iio objtool kvm_stat wmi pci 99 tmon freefall iio objtool kvm_stat wmi \
100 pci debugging
99 101
100acpi_install: 102acpi_install:
101 $(call descend,power/$(@:_install=),install) 103 $(call descend,power/$(@:_install=),install)
@@ -103,7 +105,7 @@ acpi_install:
103cpupower_install: 105cpupower_install:
104 $(call descend,power/$(@:_install=),install) 106 $(call descend,power/$(@:_install=),install)
105 107
106cgroup_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: 108cgroup_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:
107 $(call descend,$(@:_install=),install) 109 $(call descend,$(@:_install=),install)
108 110
109liblockdep_install: 111liblockdep_install:
@@ -129,7 +131,7 @@ install: acpi_install cgroup_install cpupower_install gpio_install \
129 perf_install selftests_install turbostat_install usb_install \ 131 perf_install selftests_install turbostat_install usb_install \
130 virtio_install vm_install bpf_install x86_energy_perf_policy_install \ 132 virtio_install vm_install bpf_install x86_energy_perf_policy_install \
131 tmon_install freefall_install objtool_install kvm_stat_install \ 133 tmon_install freefall_install objtool_install kvm_stat_install \
132 wmi_install pci_install 134 wmi_install pci_install debugging_install
133 135
134acpi_clean: 136acpi_clean:
135 $(call descend,power/acpi,clean) 137 $(call descend,power/acpi,clean)
@@ -137,7 +139,7 @@ acpi_clean:
137cpupower_clean: 139cpupower_clean:
138 $(call descend,power/cpupower,clean) 140 $(call descend,power/cpupower,clean)
139 141
140cgroup_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: 142cgroup_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:
141 $(call descend,$(@:_clean=),clean) 143 $(call descend,$(@:_clean=),clean)
142 144
143liblockdep_clean: 145liblockdep_clean:
@@ -175,6 +177,6 @@ clean: acpi_clean cgroup_clean cpupower_clean hv_clean firewire_clean \
175 perf_clean selftests_clean turbostat_clean spi_clean usb_clean virtio_clean \ 177 perf_clean selftests_clean turbostat_clean spi_clean usb_clean virtio_clean \
176 vm_clean bpf_clean iio_clean x86_energy_perf_policy_clean tmon_clean \ 178 vm_clean bpf_clean iio_clean x86_energy_perf_policy_clean tmon_clean \
177 freefall_clean build_clean libbpf_clean libsubcmd_clean liblockdep_clean \ 179 freefall_clean build_clean libbpf_clean libsubcmd_clean liblockdep_clean \
178 gpio_clean objtool_clean leds_clean wmi_clean pci_clean 180 gpio_clean objtool_clean leds_clean wmi_clean pci_clean debugging_clean
179 181
180.PHONY: FORCE 182.PHONY: FORCE
diff --git a/tools/debugging/Makefile b/tools/debugging/Makefile
new file mode 100644
index 000000000000..e2b7c1a6fb8f
--- /dev/null
+++ b/tools/debugging/Makefile
@@ -0,0 +1,16 @@
1# SPDX-License-Identifier: GPL-2.0
2# Makefile for debugging tools
3
4PREFIX ?= /usr
5BINDIR ?= bin
6INSTALL ?= install
7
8TARGET = kernel-chktaint
9
10all: $(TARGET)
11
12clean:
13
14install: kernel-chktaint
15 $(INSTALL) -D -m 755 $(TARGET) $(DESTDIR)$(PREFIX)/$(BINDIR)/$(TARGET)
16
diff --git a/tools/debugging/kernel-chktaint b/tools/debugging/kernel-chktaint
new file mode 100755
index 000000000000..2240cb56e6e5
--- /dev/null
+++ b/tools/debugging/kernel-chktaint
@@ -0,0 +1,202 @@
1#! /bin/sh
2# SPDX-License-Identifier: GPL-2.0
3#
4# Randy Dunlap <rdunlap@infradead.org>, 2018
5# Thorsten Leemhuis <linux@leemhuis.info>, 2018
6
7usage()
8{
9 cat <<EOF
10usage: ${0##*/}
11 ${0##*/} <int>
12
13Call without parameters to decode /proc/sys/kernel/tainted.
14
15Call with a positive integer as parameter to decode a value you
16retrieved from /proc/sys/kernel/tainted on another system.
17
18EOF
19}
20
21if [ "$1"x != "x" ]; then
22 if [ "$1"x == "--helpx" ] || [ "$1"x == "-hx" ] ; then
23 usage
24 exit 1
25 elif [ $1 -ge 0 ] 2>/dev/null ; then
26 taint=$1
27 else
28 echo "Error: Parameter '$1' not a positive interger. Aborting." >&2
29 exit 1
30 fi
31else
32 TAINTFILE="/proc/sys/kernel/tainted"
33 if [ ! -r $TAINTFILE ]; then
34 echo "No file: $TAINTFILE"
35 exit
36 fi
37
38 taint=`cat $TAINTFILE`
39fi
40
41if [ $taint -eq 0 ]; then
42 echo "Kernel not Tainted"
43 exit
44else
45 echo "Kernel is \"tainted\" for the following reasons:"
46fi
47
48T=$taint
49out=
50
51addout() {
52 out=$out$1
53}
54
55if [ `expr $T % 2` -eq 0 ]; then
56 addout "G"
57else
58 addout "P"
59 echo " * proprietary module was loaded (#0)"
60fi
61
62T=`expr $T / 2`
63if [ `expr $T % 2` -eq 0 ]; then
64 addout " "
65else
66 addout "F"
67 echo " * module was force loaded (#1)"
68fi
69
70T=`expr $T / 2`
71if [ `expr $T % 2` -eq 0 ]; then
72 addout " "
73else
74 addout "S"
75 echo " * SMP kernel oops on an officially SMP incapable processor (#2)"
76fi
77
78T=`expr $T / 2`
79if [ `expr $T % 2` -eq 0 ]; then
80 addout " "
81else
82 addout "R"
83 echo " * module was force unloaded (#3)"
84fi
85
86T=`expr $T / 2`
87if [ `expr $T % 2` -eq 0 ]; then
88 addout " "
89else
90 addout "M"
91 echo " * processor reported a Machine Check Exception (MCE) (#4)"
92fi
93
94T=`expr $T / 2`
95if [ `expr $T % 2` -eq 0 ]; then
96 addout " "
97else
98 addout "B"
99 echo " * bad page referenced or some unexpected page flags (#5)"
100fi
101
102T=`expr $T / 2`
103if [ `expr $T % 2` -eq 0 ]; then
104 addout " "
105else
106 addout "U"
107 echo " * taint requested by userspace application (#6)"
108fi
109
110T=`expr $T / 2`
111if [ `expr $T % 2` -eq 0 ]; then
112 addout " "
113else
114 addout "D"
115 echo " * kernel died recently, i.e. there was an OOPS or BUG (#7)"
116fi
117
118T=`expr $T / 2`
119if [ `expr $T % 2` -eq 0 ]; then
120 addout " "
121else
122 addout "A"
123 echo " * an ACPI table was overridden by user (#8)"
124fi
125
126T=`expr $T / 2`
127if [ `expr $T % 2` -eq 0 ]; then
128 addout " "
129else
130 addout "W"
131 echo " * kernel issued warning (#9)"
132fi
133
134T=`expr $T / 2`
135if [ `expr $T % 2` -eq 0 ]; then
136 addout " "
137else
138 addout "C"
139 echo " * staging driver was loaded (#10)"
140fi
141
142T=`expr $T / 2`
143if [ `expr $T % 2` -eq 0 ]; then
144 addout " "
145else
146 addout "I"
147 echo " * workaround for bug in platform firmware applied (#11)"
148fi
149
150T=`expr $T / 2`
151if [ `expr $T % 2` -eq 0 ]; then
152 addout " "
153else
154 addout "O"
155 echo " * externally-built ('out-of-tree') module was loaded (#12)"
156fi
157
158T=`expr $T / 2`
159if [ `expr $T % 2` -eq 0 ]; then
160 addout " "
161else
162 addout "E"
163 echo " * unsigned module was loaded (#13)"
164fi
165
166T=`expr $T / 2`
167if [ `expr $T % 2` -eq 0 ]; then
168 addout " "
169else
170 addout "L"
171 echo " * soft lockup occurred (#14)"
172fi
173
174T=`expr $T / 2`
175if [ `expr $T % 2` -eq 0 ]; then
176 addout " "
177else
178 addout "K"
179 echo " * kernel has been live patched (#15)"
180fi
181
182T=`expr $T / 2`
183if [ `expr $T % 2` -eq 0 ]; then
184 addout " "
185else
186 addout "X"
187 echo " * auxiliary taint, defined for and used by distros (#16)"
188
189fi
190T=`expr $T / 2`
191if [ `expr $T % 2` -eq 0 ]; then
192 addout " "
193else
194 addout "T"
195 echo " * kernel was built with the struct randomization plugin (#17)"
196fi
197
198echo "For a more detailed explanation of the various taint flags see"
199echo " Documentation/admin-guide/tainted-kernels.rst in the the Linux kernel sources"
200echo " or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html"
201echo "Raw taint value as int/string: $taint/'$out'"
202#EOF#