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