Requesting a fwctl scope of access that includes mutating device debug data will cause the kernel to be tainted. Changing the device operation through things in the debug scope may cause the device to malfunction in undefined ways. This should be reflected in the TAINT flags to help any debuggers understand that something has been done. Link: https://patch.msgid.link/r/4-v5-642aa0c94070+4447f-fwctl_jgg@nvidia.com Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Reviewed-by: Dave Jiang <dave.jiang@intel.com> Reviewed-by: Shannon Nelson <shannon.nelson@amd.com> Tested-by: Dave Jiang <dave.jiang@intel.com> Tested-by: Shannon Nelson <shannon.nelson@amd.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
3.9 KiB
Executable File
#! /bin/sh
SPDX-License-Identifier: GPL-2.0
Randy Dunlap rdunlap@infradead.org, 2018
Thorsten Leemhuis linux@leemhuis.info, 2018
usage() { cat <<EOF usage: ${0##/} ${0##/}
Call without parameters to decode /proc/sys/kernel/tainted.
Call with a positive integer as parameter to decode a value you retrieved from /proc/sys/kernel/tainted on another system.
EOF }
if [ "$1"x != "x" ]; then if [ "$1"x == "--helpx" ] || [ "$1"x == "-hx" ] ; then usage exit 1 elif [ $1 -ge 0 ] 2>/dev/null ; then taint=$1 else echo "Error: Parameter '$1' not a positive integer. Aborting." >&2 exit 1 fi else TAINTFILE="/proc/sys/kernel/tainted" if [ ! -r $TAINTFILE ]; then echo "No file: $TAINTFILE" exit fi
taint=`cat $TAINTFILE`
fi
if [ $taint -eq 0 ]; then echo "Kernel not Tainted" exit else echo "Kernel is "tainted" for the following reasons:" fi
T=$taint out=
addout() { out=$out$1 }
if [ expr $T % 2 -eq 0 ]; then
addout "G"
else
addout "P"
echo " * proprietary module was loaded (#0)"
fi
T=expr $T / 2
if [ expr $T % 2 -eq 0 ]; then
addout " "
else
addout "F"
echo " * module was force loaded (#1)"
fi
T=expr $T / 2
if [ expr $T % 2 -eq 0 ]; then
addout " "
else
addout "S"
echo " * kernel running on an out of specification system (#2)"
fi
T=expr $T / 2
if [ expr $T % 2 -eq 0 ]; then
addout " "
else
addout "R"
echo " * module was force unloaded (#3)"
fi
T=expr $T / 2
if [ expr $T % 2 -eq 0 ]; then
addout " "
else
addout "M"
echo " * processor reported a Machine Check Exception (MCE) (#4)"
fi
T=expr $T / 2
if [ expr $T % 2 -eq 0 ]; then
addout " "
else
addout "B"
echo " * bad page referenced or some unexpected page flags (#5)"
fi
T=expr $T / 2
if [ expr $T % 2 -eq 0 ]; then
addout " "
else
addout "U"
echo " * taint requested by userspace application (#6)"
fi
T=expr $T / 2
if [ expr $T % 2 -eq 0 ]; then
addout " "
else
addout "D"
echo " * kernel died recently, i.e. there was an OOPS or BUG (#7)"
fi
T=expr $T / 2
if [ expr $T % 2 -eq 0 ]; then
addout " "
else
addout "A"
echo " * an ACPI table was overridden by user (#8)"
fi
T=expr $T / 2
if [ expr $T % 2 -eq 0 ]; then
addout " "
else
addout "W"
echo " * kernel issued warning (#9)"
fi
T=expr $T / 2
if [ expr $T % 2 -eq 0 ]; then
addout " "
else
addout "C"
echo " * staging driver was loaded (#10)"
fi
T=expr $T / 2
if [ expr $T % 2 -eq 0 ]; then
addout " "
else
addout "I"
echo " * workaround for bug in platform firmware applied (#11)"
fi
T=expr $T / 2
if [ expr $T % 2 -eq 0 ]; then
addout " "
else
addout "O"
echo " * externally-built ('out-of-tree') module was loaded (#12)"
fi
T=expr $T / 2
if [ expr $T % 2 -eq 0 ]; then
addout " "
else
addout "E"
echo " * unsigned module was loaded (#13)"
fi
T=expr $T / 2
if [ expr $T % 2 -eq 0 ]; then
addout " "
else
addout "L"
echo " * soft lockup occurred (#14)"
fi
T=expr $T / 2
if [ expr $T % 2 -eq 0 ]; then
addout " "
else
addout "K"
echo " * kernel has been live patched (#15)"
fi
T=expr $T / 2
if [ expr $T % 2 -eq 0 ]; then
addout " "
else
addout "X"
echo " * auxiliary taint, defined for and used by distros (#16)"
fi
T=expr $T / 2
if [ expr $T % 2 -eq 0 ]; then
addout " "
else
addout "T"
echo " * kernel was built with the struct randomization plugin (#17)"
fi
T=expr $T / 2
if [ expr $T % 2 -eq 0 ]; then
addout " "
else
addout "N"
echo " * an in-kernel test (such as a KUnit test) has been run (#18)"
fi
T=expr $T / 2
if [ expr $T % 2 -eq 0 ]; then
addout " "
else
addout "J"
echo " * fwctl's mutating debug interface was used (#19)"
fi
echo "For a more detailed explanation of the various taint flags see" echo " Documentation/admin-guide/tainted-kernels.rst in the Linux kernel sources" echo " or https://kernel.org/doc/html/latest/admin-guide/tainted-kernels.html" echo "Raw taint value as int/string: $taint/'$out'" #EOF#