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