162306a36Sopenharmony_ci#! /bin/sh
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci#
462306a36Sopenharmony_ci# Randy Dunlap <rdunlap@infradead.org>, 2018
562306a36Sopenharmony_ci# Thorsten Leemhuis <linux@leemhuis.info>, 2018
662306a36Sopenharmony_ci
762306a36Sopenharmony_ciusage()
862306a36Sopenharmony_ci{
962306a36Sopenharmony_ci	cat <<EOF
1062306a36Sopenharmony_ciusage: ${0##*/}
1162306a36Sopenharmony_ci       ${0##*/} <int>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ciCall without parameters to decode /proc/sys/kernel/tainted.
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ciCall with a positive integer as parameter to decode a value you
1662306a36Sopenharmony_ciretrieved from /proc/sys/kernel/tainted on another system.
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ciEOF
1962306a36Sopenharmony_ci}
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ciif [ "$1"x != "x" ]; then
2262306a36Sopenharmony_ci	if  [ "$1"x == "--helpx" ] || [ "$1"x == "-hx" ] ; then
2362306a36Sopenharmony_ci		usage
2462306a36Sopenharmony_ci		exit 1
2562306a36Sopenharmony_ci	elif  [ $1 -ge 0 ] 2>/dev/null ; then
2662306a36Sopenharmony_ci		taint=$1
2762306a36Sopenharmony_ci	else
2862306a36Sopenharmony_ci		echo "Error: Parameter '$1' not a positive integer. Aborting." >&2
2962306a36Sopenharmony_ci		exit 1
3062306a36Sopenharmony_ci	fi
3162306a36Sopenharmony_cielse
3262306a36Sopenharmony_ci	TAINTFILE="/proc/sys/kernel/tainted"
3362306a36Sopenharmony_ci	if [ ! -r $TAINTFILE ]; then
3462306a36Sopenharmony_ci		echo "No file: $TAINTFILE"
3562306a36Sopenharmony_ci		exit
3662306a36Sopenharmony_ci	fi
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	taint=`cat $TAINTFILE`
3962306a36Sopenharmony_cifi
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ciif [ $taint -eq 0 ]; then
4262306a36Sopenharmony_ci	echo "Kernel not Tainted"
4362306a36Sopenharmony_ci	exit
4462306a36Sopenharmony_cielse
4562306a36Sopenharmony_ci	echo "Kernel is \"tainted\" for the following reasons:"
4662306a36Sopenharmony_cifi
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ciT=$taint
4962306a36Sopenharmony_ciout=
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ciaddout() {
5262306a36Sopenharmony_ci	out=$out$1
5362306a36Sopenharmony_ci}
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ciif [ `expr $T % 2` -eq 0 ]; then
5662306a36Sopenharmony_ci	addout "G"
5762306a36Sopenharmony_cielse
5862306a36Sopenharmony_ci	addout "P"
5962306a36Sopenharmony_ci	echo " * proprietary module was loaded (#0)"
6062306a36Sopenharmony_cifi
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ciT=`expr $T / 2`
6362306a36Sopenharmony_ciif [ `expr $T % 2` -eq 0 ]; then
6462306a36Sopenharmony_ci	addout " "
6562306a36Sopenharmony_cielse
6662306a36Sopenharmony_ci	addout "F"
6762306a36Sopenharmony_ci	echo " * module was force loaded (#1)"
6862306a36Sopenharmony_cifi
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ciT=`expr $T / 2`
7162306a36Sopenharmony_ciif [ `expr $T % 2` -eq 0 ]; then
7262306a36Sopenharmony_ci	addout " "
7362306a36Sopenharmony_cielse
7462306a36Sopenharmony_ci	addout "S"
7562306a36Sopenharmony_ci	echo " * kernel running on an out of specification system (#2)"
7662306a36Sopenharmony_cifi
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ciT=`expr $T / 2`
7962306a36Sopenharmony_ciif [ `expr $T % 2` -eq 0 ]; then
8062306a36Sopenharmony_ci	addout " "
8162306a36Sopenharmony_cielse
8262306a36Sopenharmony_ci	addout "R"
8362306a36Sopenharmony_ci	echo " * module was force unloaded (#3)"
8462306a36Sopenharmony_cifi
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ciT=`expr $T / 2`
8762306a36Sopenharmony_ciif [ `expr $T % 2` -eq 0 ]; then
8862306a36Sopenharmony_ci	addout " "
8962306a36Sopenharmony_cielse
9062306a36Sopenharmony_ci	addout "M"
9162306a36Sopenharmony_ci	echo " * processor reported a Machine Check Exception (MCE) (#4)"
9262306a36Sopenharmony_cifi
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ciT=`expr $T / 2`
9562306a36Sopenharmony_ciif [ `expr $T % 2` -eq 0 ]; then
9662306a36Sopenharmony_ci	addout " "
9762306a36Sopenharmony_cielse
9862306a36Sopenharmony_ci	addout "B"
9962306a36Sopenharmony_ci	echo " * bad page referenced or some unexpected page flags (#5)"
10062306a36Sopenharmony_cifi
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ciT=`expr $T / 2`
10362306a36Sopenharmony_ciif [ `expr $T % 2` -eq 0 ]; then
10462306a36Sopenharmony_ci	addout " "
10562306a36Sopenharmony_cielse
10662306a36Sopenharmony_ci	addout "U"
10762306a36Sopenharmony_ci	echo " * taint requested by userspace application (#6)"
10862306a36Sopenharmony_cifi
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ciT=`expr $T / 2`
11162306a36Sopenharmony_ciif [ `expr $T % 2` -eq 0 ]; then
11262306a36Sopenharmony_ci	addout " "
11362306a36Sopenharmony_cielse
11462306a36Sopenharmony_ci	addout "D"
11562306a36Sopenharmony_ci	echo " * kernel died recently, i.e. there was an OOPS or BUG (#7)"
11662306a36Sopenharmony_cifi
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ciT=`expr $T / 2`
11962306a36Sopenharmony_ciif [ `expr $T % 2` -eq 0 ]; then
12062306a36Sopenharmony_ci	addout " "
12162306a36Sopenharmony_cielse
12262306a36Sopenharmony_ci	addout "A"
12362306a36Sopenharmony_ci	echo " * an ACPI table was overridden by user (#8)"
12462306a36Sopenharmony_cifi
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ciT=`expr $T / 2`
12762306a36Sopenharmony_ciif [ `expr $T % 2` -eq 0 ]; then
12862306a36Sopenharmony_ci	addout " "
12962306a36Sopenharmony_cielse
13062306a36Sopenharmony_ci	addout "W"
13162306a36Sopenharmony_ci	echo " * kernel issued warning (#9)"
13262306a36Sopenharmony_cifi
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ciT=`expr $T / 2`
13562306a36Sopenharmony_ciif [ `expr $T % 2` -eq 0 ]; then
13662306a36Sopenharmony_ci	addout " "
13762306a36Sopenharmony_cielse
13862306a36Sopenharmony_ci	addout "C"
13962306a36Sopenharmony_ci	echo " * staging driver was loaded (#10)"
14062306a36Sopenharmony_cifi
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_ciT=`expr $T / 2`
14362306a36Sopenharmony_ciif [ `expr $T % 2` -eq 0 ]; then
14462306a36Sopenharmony_ci	addout " "
14562306a36Sopenharmony_cielse
14662306a36Sopenharmony_ci	addout "I"
14762306a36Sopenharmony_ci	echo " * workaround for bug in platform firmware applied (#11)"
14862306a36Sopenharmony_cifi
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ciT=`expr $T / 2`
15162306a36Sopenharmony_ciif [ `expr $T % 2` -eq 0 ]; then
15262306a36Sopenharmony_ci	addout " "
15362306a36Sopenharmony_cielse
15462306a36Sopenharmony_ci	addout "O"
15562306a36Sopenharmony_ci	echo " * externally-built ('out-of-tree') module was loaded  (#12)"
15662306a36Sopenharmony_cifi
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ciT=`expr $T / 2`
15962306a36Sopenharmony_ciif [ `expr $T % 2` -eq 0 ]; then
16062306a36Sopenharmony_ci	addout " "
16162306a36Sopenharmony_cielse
16262306a36Sopenharmony_ci	addout "E"
16362306a36Sopenharmony_ci	echo " * unsigned module was loaded (#13)"
16462306a36Sopenharmony_cifi
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ciT=`expr $T / 2`
16762306a36Sopenharmony_ciif [ `expr $T % 2` -eq 0 ]; then
16862306a36Sopenharmony_ci	addout " "
16962306a36Sopenharmony_cielse
17062306a36Sopenharmony_ci	addout "L"
17162306a36Sopenharmony_ci	echo " * soft lockup occurred (#14)"
17262306a36Sopenharmony_cifi
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ciT=`expr $T / 2`
17562306a36Sopenharmony_ciif [ `expr $T % 2` -eq 0 ]; then
17662306a36Sopenharmony_ci	addout " "
17762306a36Sopenharmony_cielse
17862306a36Sopenharmony_ci	addout "K"
17962306a36Sopenharmony_ci	echo " * kernel has been live patched (#15)"
18062306a36Sopenharmony_cifi
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ciT=`expr $T / 2`
18362306a36Sopenharmony_ciif [ `expr $T % 2` -eq 0 ]; then
18462306a36Sopenharmony_ci	addout " "
18562306a36Sopenharmony_cielse
18662306a36Sopenharmony_ci	addout "X"
18762306a36Sopenharmony_ci	echo " * auxiliary taint, defined for and used by distros (#16)"
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_cifi
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ciT=`expr $T / 2`
19262306a36Sopenharmony_ciif [ `expr $T % 2` -eq 0 ]; then
19362306a36Sopenharmony_ci	addout " "
19462306a36Sopenharmony_cielse
19562306a36Sopenharmony_ci	addout "T"
19662306a36Sopenharmony_ci	echo " * kernel was built with the struct randomization plugin (#17)"
19762306a36Sopenharmony_cifi
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ciT=`expr $T / 2`
20062306a36Sopenharmony_ciif [ `expr $T % 2` -eq 0 ]; then
20162306a36Sopenharmony_ci	addout " "
20262306a36Sopenharmony_cielse
20362306a36Sopenharmony_ci	addout "N"
20462306a36Sopenharmony_ci	echo " * an in-kernel test (such as a KUnit test) has been run (#18)"
20562306a36Sopenharmony_cifi
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_ciecho "For a more detailed explanation of the various taint flags see"
20862306a36Sopenharmony_ciecho " Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources"
20962306a36Sopenharmony_ciecho " or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html"
21062306a36Sopenharmony_ciecho "Raw taint value as int/string: $taint/'$out'"
21162306a36Sopenharmony_ci#EOF#
212