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