kernel-chktaint 3.6 KB

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