Commit | Line | Data |
---|---|---|
4ab5a5d2 TL |
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 | |
84de8154 | 28 | echo "Error: Parameter '$1' not a positive integer. Aborting." >&2 |
4ab5a5d2 TL |
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" | |
547f574f | 75 | echo " * kernel running on an out of specification system (#2)" |
4ab5a5d2 TL |
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 | |
2a2dfc86 | 190 | |
4ab5a5d2 TL |
191 | T=`expr $T / 2` |
192 | if [ `expr $T % 2` -eq 0 ]; then | |
193 | addout " " | |
194 | else | |
195 | addout "T" | |
196 | echo " * kernel was built with the struct randomization plugin (#17)" | |
197 | fi | |
198 | ||
2a2dfc86 JF |
199 | T=`expr $T / 2` |
200 | if [ `expr $T % 2` -eq 0 ]; then | |
201 | addout " " | |
202 | else | |
203 | addout "N" | |
204 | echo " * an in-kernel test (such as a KUnit test) has been run (#18)" | |
205 | fi | |
206 | ||
4ab5a5d2 | 207 | echo "For a more detailed explanation of the various taint flags see" |
c098564d | 208 | echo " Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources" |
4ab5a5d2 TL |
209 | echo " or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html" |
210 | echo "Raw taint value as int/string: $taint/'$out'" | |
211 | #EOF# |