Merge tag 'nfs-for-5.2-1' of git://git.linux-nfs.org/projects/anna/linux-nfs
[sfrench/cifs-2.6.git] / tools / debugging / kernel-chktaint
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
7 usage()
8 {
9         cat <<EOF
10 usage: ${0##*/}
11        ${0##*/} <int>
12
13 Call without parameters to decode /proc/sys/kernel/tainted.
14
15 Call with a positive integer as parameter to decode a value you
16 retrieved from /proc/sys/kernel/tainted on another system.
17
18 EOF
19 }
20
21 if [ "$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
31 else
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`
39 fi
40
41 if [ $taint -eq 0 ]; then
42         echo "Kernel not Tainted"
43         exit
44 else
45         echo "Kernel is \"tainted\" for the following reasons:"
46 fi
47
48 T=$taint
49 out=
50
51 addout() {
52         out=$out$1
53 }
54
55 if [ `expr $T % 2` -eq 0 ]; then
56         addout "G"
57 else
58         addout "P"
59         echo " * proprietary module was loaded (#0)"
60 fi
61
62 T=`expr $T / 2`
63 if [ `expr $T % 2` -eq 0 ]; then
64         addout " "
65 else
66         addout "F"
67         echo " * module was force loaded (#1)"
68 fi
69
70 T=`expr $T / 2`
71 if [ `expr $T % 2` -eq 0 ]; then
72         addout " "
73 else
74         addout "S"
75         echo " * SMP kernel oops on an officially SMP incapable processor (#2)"
76 fi
77
78 T=`expr $T / 2`
79 if [ `expr $T % 2` -eq 0 ]; then
80         addout " "
81 else
82         addout "R"
83         echo " * module was force unloaded (#3)"
84 fi
85
86 T=`expr $T / 2`
87 if [ `expr $T % 2` -eq 0 ]; then
88         addout " "
89 else
90         addout "M"
91         echo " * processor reported a Machine Check Exception (MCE) (#4)"
92 fi
93
94 T=`expr $T / 2`
95 if [ `expr $T % 2` -eq 0 ]; then
96         addout " "
97 else
98         addout "B"
99         echo " * bad page referenced or some unexpected page flags (#5)"
100 fi
101
102 T=`expr $T / 2`
103 if [ `expr $T % 2` -eq 0 ]; then
104         addout " "
105 else
106         addout "U"
107         echo " * taint requested by userspace application (#6)"
108 fi
109
110 T=`expr $T / 2`
111 if [ `expr $T % 2` -eq 0 ]; then
112         addout " "
113 else
114         addout "D"
115         echo " * kernel died recently, i.e. there was an OOPS or BUG (#7)"
116 fi
117
118 T=`expr $T / 2`
119 if [ `expr $T % 2` -eq 0 ]; then
120         addout " "
121 else
122         addout "A"
123         echo " * an ACPI table was overridden by user (#8)"
124 fi
125
126 T=`expr $T / 2`
127 if [ `expr $T % 2` -eq 0 ]; then
128         addout " "
129 else
130         addout "W"
131         echo " * kernel issued warning (#9)"
132 fi
133
134 T=`expr $T / 2`
135 if [ `expr $T % 2` -eq 0 ]; then
136         addout " "
137 else
138         addout "C"
139         echo " * staging driver was loaded (#10)"
140 fi
141
142 T=`expr $T / 2`
143 if [ `expr $T % 2` -eq 0 ]; then
144         addout " "
145 else
146         addout "I"
147         echo " * workaround for bug in platform firmware applied (#11)"
148 fi
149
150 T=`expr $T / 2`
151 if [ `expr $T % 2` -eq 0 ]; then
152         addout " "
153 else
154         addout "O"
155         echo " * externally-built ('out-of-tree') module was loaded  (#12)"
156 fi
157
158 T=`expr $T / 2`
159 if [ `expr $T % 2` -eq 0 ]; then
160         addout " "
161 else
162         addout "E"
163         echo " * unsigned module was loaded (#13)"
164 fi
165
166 T=`expr $T / 2`
167 if [ `expr $T % 2` -eq 0 ]; then
168         addout " "
169 else
170         addout "L"
171         echo " * soft lockup occurred (#14)"
172 fi
173
174 T=`expr $T / 2`
175 if [ `expr $T % 2` -eq 0 ]; then
176         addout " "
177 else
178         addout "K"
179         echo " * kernel has been live patched (#15)"
180 fi
181
182 T=`expr $T / 2`
183 if [ `expr $T % 2` -eq 0 ]; then
184         addout " "
185 else
186         addout "X"
187         echo " * auxiliary taint, defined for and used by distros (#16)"
188
189 fi
190 T=`expr $T / 2`
191 if [ `expr $T % 2` -eq 0 ]; then
192         addout " "
193 else
194         addout "T"
195         echo " * kernel was built with the struct randomization plugin (#17)"
196 fi
197
198 echo "For a more detailed explanation of the various taint flags see"
199 echo " Documentation/admin-guide/tainted-kernels.rst in the the Linux kernel sources"
200 echo " or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html"
201 echo "Raw taint value as int/string: $taint/'$out'"
202 #EOF#