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