| |
@@ -0,0 +1,258 @@
|
| |
+ #!/bin/bash
|
| |
+
|
| |
+ dir_extra=/usr/lib/modules/$(uname -r)/extra
|
| |
+ dir_updates=/usr/lib/modules/$(uname -r)/updates
|
| |
+ dir_weak_updates=/usr/lib/modules/$(uname -r)/weak-updates
|
| |
+ kmods=(base kmod_test_force kmod_test)
|
| |
+
|
| |
+ function kmod_log_warn()
|
| |
+ {
|
| |
+ echo "WARN: $*"
|
| |
+ }
|
| |
+
|
| |
+
|
| |
+ function kmod_log_pass()
|
| |
+ {
|
| |
+ echo "PASS: $*"
|
| |
+ }
|
| |
+
|
| |
+ function kmod_log_fail()
|
| |
+ {
|
| |
+ echo "FAIL: $*"
|
| |
+ }
|
| |
+
|
| |
+ function kmod_log_info()
|
| |
+ {
|
| |
+ echo "INFO: $*"
|
| |
+ }
|
| |
+
|
| |
+ function kmod_log_err()
|
| |
+ {
|
| |
+ echo "ERR: $*"
|
| |
+ }
|
| |
+
|
| |
+ function kmod_verify_exist()
|
| |
+ {
|
| |
+ local files=$*
|
| |
+ local ret=0
|
| |
+ local msg=0
|
| |
+ local f=
|
| |
+ for f in $files; do
|
| |
+ if ! test -f $f; then
|
| |
+ ret=$((ret + 1))
|
| |
+ continue
|
| |
+ fi
|
| |
+ done
|
| |
+ return $ret
|
| |
+ }
|
| |
+
|
| |
+ function kmod_verify_loaded()
|
| |
+ {
|
| |
+ local kmods=$*
|
| |
+ local ret=$?
|
| |
+ for kmod in $kmods; do
|
| |
+ lsmod | grep -w ${kmod/.ko/}
|
| |
+ if [ $? -ne 0 ]; then
|
| |
+ ret=$((ret+1))
|
| |
+ continue
|
| |
+ fi
|
| |
+ done
|
| |
+ return $ret
|
| |
+ }
|
| |
+
|
| |
+ # tainted should be shown
|
| |
+ function kmod_verify_dmesg()
|
| |
+ {
|
| |
+ local str="$1"
|
| |
+ dmesg | grep -i "$str"
|
| |
+ return $?
|
| |
+ }
|
| |
+
|
| |
+ function kmod_verify_tainted()
|
| |
+ {
|
| |
+ local kmod=$1
|
| |
+ shift
|
| |
+ local taint_expect=$*
|
| |
+ local ret=0
|
| |
+ local checker=./parse_taint.sh
|
| |
+ local tainted=$(cat /proc/sys/kernel/tainted)
|
| |
+ kmod_log_info "Kernel taint value: $tainted"
|
| |
+ local flag=
|
| |
+ for flag in $taint_expect; do
|
| |
+ $checker $tainted | grep -we $flag || ret=$((ret + 1))
|
| |
+ done
|
| |
+ return $ret
|
| |
+ }
|
| |
+
|
| |
+ function kmod_verify_tainted_module()
|
| |
+ {
|
| |
+ local kmod=$1
|
| |
+ shift
|
| |
+ local taint_expect="$*"
|
| |
+ local ret=0
|
| |
+
|
| |
+ if ! test -f /sys/module/$kmod/taint; then
|
| |
+ kmod_log_info "Kmod taint value on module $kmod not supported"
|
| |
+ kmod_log_info "$(ls /sys/module/$kmod/)"
|
| |
+ return 0
|
| |
+ fi
|
| |
+
|
| |
+ local kmod_tainted=$(cat /sys/module/$kmod/taint)
|
| |
+ ret=$(( $ret + 1 ))
|
| |
+ kmod_log_info "Kmod taint value: $kmod_tainted"
|
| |
+
|
| |
+ local flag=
|
| |
+ local grep_exec="grep"
|
| |
+ for flag in $*; do
|
| |
+ grep_exec+=" -e $flag"
|
| |
+ done
|
| |
+
|
| |
+ echo "$kmod_tainted" | $grep_exec
|
| |
+ ret=$?
|
| |
+ return $ret
|
| |
+ }
|
| |
+
|
| |
+ function kmod_check_result()
|
| |
+ {
|
| |
+ local opt=$1
|
| |
+ shift 1
|
| |
+ local dir=$1
|
| |
+ shift 1
|
| |
+ local files=$*
|
| |
+ case $opt in
|
| |
+ compile)
|
| |
+ for f in $files; do
|
| |
+ if kmod_verify_exist $dir/$f; then
|
| |
+ kmod_log_pass "File exist: $dir/$f"
|
| |
+ else
|
| |
+ kmod_log_fail "File does not exist: $dir/$f"
|
| |
+ return 1
|
| |
+ fi
|
| |
+ done
|
| |
+ ;;
|
| |
+ load)
|
| |
+ for f in $files; do
|
| |
+ if kmod_verify_loaded $f; then
|
| |
+ kmod_log_fail $f not loaded
|
| |
+ return 1
|
| |
+ else
|
| |
+ kmod_log_pass $f loaded
|
| |
+ fi
|
| |
+ done
|
| |
+ ;;
|
| |
+ unload)
|
| |
+ for f in $files; do
|
| |
+ if ! kmod_verify_loaded $f; then
|
| |
+ kmod_log_fail $f unloaded
|
| |
+ return 1
|
| |
+ else
|
| |
+ kmod_log_pass $f not loaded
|
| |
+ fi
|
| |
+ done
|
| |
+ ;;
|
| |
+ *)
|
| |
+ ;;
|
| |
+ esac
|
| |
+ return 0
|
| |
+ }
|
| |
+
|
| |
+ # Locate the compiled kmods into several dirs for different
|
| |
+ # tests.
|
| |
+ function kmod_locate_extra()
|
| |
+ {
|
| |
+ local ret=0
|
| |
+ if ! test -d $dir_extra; then
|
| |
+ kmod_log_warn "$dir_extra does not exist."
|
| |
+ return 1
|
| |
+ fi
|
| |
+ local f=
|
| |
+ for f in $*; do
|
| |
+ cp -f $f $dir_extra || ret=$((ret + 1))
|
| |
+ done
|
| |
+ depmod || ret=$((ret+1))
|
| |
+ return $ret
|
| |
+ }
|
| |
+
|
| |
+ function kmod_locate_updates()
|
| |
+ {
|
| |
+ local ret=0
|
| |
+ if ! test -d $dir_updates; then
|
| |
+ kmod_log_warn "$dir_updates does not exist."
|
| |
+ return 1
|
| |
+ fi
|
| |
+ for f in $*; do
|
| |
+ cp -f $f $dir_updates || ret=$((ret + 1))
|
| |
+ done
|
| |
+ depmod || ret=$((ret+1))
|
| |
+ return $ret
|
| |
+ }
|
| |
+
|
| |
+ function kmod_locate_weak_updates()
|
| |
+ {
|
| |
+ local ret=0
|
| |
+ if ! test -d $dir_weak_updates; then
|
| |
+ kmod_log_warn "$dir_weak_updates does not exist."
|
| |
+ return 1
|
| |
+ fi
|
| |
+ for f in $*; do
|
| |
+ cp -f $f $dir_weak_updates || ret=$((ret + 1))
|
| |
+ done
|
| |
+ depmod || ret=$((ret+1))
|
| |
+ return $ret
|
| |
+ }
|
| |
+
|
| |
+ function kmod_cleanup_all()
|
| |
+ {
|
| |
+ local ret=$?
|
| |
+ for ko in ${kmod[*]}; do
|
| |
+ test -f $dir_extra/${ko}.ko && rm -r $dir_extra/${ko}.ko
|
| |
+ test -f $dir_weak_updates/${ko}.ko && rm -r $dir_weak_updates/${ko}.ko
|
| |
+ test -f $dir_updates/${ko}.ko && rm -r $dir_extra/${ko}.ko
|
| |
+ done
|
| |
+ }
|
| |
+
|
| |
+ # The kmods should be loaded now.
|
| |
+ function kmod_check_all_loaded()
|
| |
+ {
|
| |
+ local ret=$?
|
| |
+ lsmod | grep base -w
|
| |
+ ret=$(($ret + $?))
|
| |
+ lsmod | grep -w kmod_test_dependency
|
| |
+ ret=$(($ret + $?))
|
| |
+ lsmod | grep -w kmod_test_force
|
| |
+ ret=$(($ret + $?))
|
| |
+ return $ret
|
| |
+ }
|
| |
+
|
| |
+ function kmod_unload_all()
|
| |
+ {
|
| |
+ local ret=0
|
| |
+ lsmod | grep -w kmod_test_force && rmmod kmod_test_force
|
| |
+ lsmod | grep -w base && rmmod base
|
| |
+ ! lsmod | grep -w base
|
| |
+ ret=$(($ret | $?))
|
| |
+ ! lsmod | grep -w kmod_test_force
|
| |
+ ret=$(($ret | $?))
|
| |
+ return $ret
|
| |
+ }
|
| |
+
|
| |
+
|
| |
+ function kmod_load_all()
|
| |
+ {
|
| |
+ local kmod=
|
| |
+ kmod_unload_all || return $?
|
| |
+ for kmod in $*; do
|
| |
+ modprobe $kmod || return $?
|
| |
+ done
|
| |
+ }
|
| |
+
|
| |
+ function kmod_load_all_force()
|
| |
+ {
|
| |
+ local kmod=
|
| |
+ kmod_unload_all || return $?
|
| |
+ for kmod in $*; do
|
| |
+ modprobe -f $kmod || return $?
|
| |
+ dmesg | tail -n 10
|
| |
+ done
|
| |
+ }
|
| |
+
|
| |