forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
tools: add a kernel-chktaint to tools/debugging
Add a script to the tools/ directory that shows if or why the running kernel was tainted. The script was mostly written by Randy Dunlap; I enhanced the script a bit. There does not appear to be a good home for this script. so create tools/debugging for tools of this nature. Signed-off-by: Randy Dunlap <[email protected]> Signed-off-by: Thorsten Leemhuis <[email protected]> [ jc: fixed conflicts, rewrote changelog ] Signed-off-by: Jonathan Corbet <[email protected]>
- Loading branch information
Showing
3 changed files
with
226 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
# SPDX-License-Identifier: GPL-2.0 | ||
# Makefile for debugging tools | ||
|
||
PREFIX ?= /usr | ||
BINDIR ?= bin | ||
INSTALL ?= install | ||
|
||
TARGET = kernel-chktaint | ||
|
||
all: $(TARGET) | ||
|
||
clean: | ||
|
||
install: kernel-chktaint | ||
$(INSTALL) -D -m 755 $(TARGET) $(DESTDIR)$(PREFIX)/$(BINDIR)/$(TARGET) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,202 @@ | ||
#! /bin/sh | ||
# SPDX-License-Identifier: GPL-2.0 | ||
# | ||
# Randy Dunlap <[email protected]>, 2018 | ||
# Thorsten Leemhuis <[email protected]>, 2018 | ||
|
||
usage() | ||
{ | ||
cat <<EOF | ||
usage: ${0##*/} | ||
${0##*/} <int> | ||
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 interger. 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 " * SMP kernel oops on an officially SMP incapable processor (#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 | ||
|
||
echo "For a more detailed explanation of the various taint flags see" | ||
echo " Documentation/admin-guide/tainted-kernels.rst in the 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# |