Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 115 additions & 15 deletions Runner/suites/Kernel/Baseport/shmbridge/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

# Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
# SPDX-License-Identifier: BSD-3-Clause

# Locate and source init_env
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
INIT_ENV=""
SEARCH="$SCRIPT_DIR"

while [ "$SEARCH" != "/" ]; do
if [ -f "$SEARCH/init_env" ]; then
INIT_ENV="$SEARCH/init_env"
Expand Down Expand Up @@ -36,8 +38,8 @@ log_info "==== Test Initialization ===="

log_info "Checking if required tools are available"

if ! check_dependencies grep; then
log_skip "$TESTNAME SKIP - missing required grep utility"
if ! check_dependencies grep cat sed; then
log_skip "$TESTNAME SKIP - missing required utilities"
echo "$TESTNAME SKIP" >"$res_file"
exit 0
fi
Expand All @@ -51,33 +53,131 @@ fi

log_info "Checking qcom_scm presence using sysfs/current-boot kernel log"

qcom_scm_present=0

if [ -d /sys/module/qcom_scm ]; then
qcom_scm_present=1
log_pass "qcom_scm driver is present in sysfs."
log_info "qcom_scm sysfs node: /sys/module/qcom_scm"

if command -v print_path_meta >/dev/null 2>&1; then
print_path_meta /sys/module/qcom_scm 2>/dev/null |
while IFS= read -r line || [ -n "$line" ]; do
[ -n "$line" ] || continue
log_info "[qcom_scm-sysfs] $line"
done
fi

if [ -r /sys/module/qcom_scm/initstate ]; then
qcom_scm_initstate="$(cat /sys/module/qcom_scm/initstate 2>/dev/null || true)"
[ -n "$qcom_scm_initstate" ] || qcom_scm_initstate="unknown"
log_info "qcom_scm initstate: $qcom_scm_initstate"
else
log_info "qcom_scm initstate: <not exposed>"
fi

if [ -r /sys/module/qcom_scm/refcnt ]; then
qcom_scm_refcnt="$(cat /sys/module/qcom_scm/refcnt 2>/dev/null || true)"
[ -n "$qcom_scm_refcnt" ] || qcom_scm_refcnt="unknown"
log_info "qcom_scm refcnt: $qcom_scm_refcnt"
else
log_info "qcom_scm refcnt: <not exposed>"
fi

if [ -d /sys/module/qcom_scm/parameters ]; then
log_info "qcom_scm parameters:"
qcom_scm_param_found=0

for param in /sys/module/qcom_scm/parameters/*; do
[ -e "$param" ] || continue
qcom_scm_param_found=1
param_name="${param##*/}"

if [ -r "$param" ]; then
param_value="$(cat "$param" 2>/dev/null || true)"
[ -n "$param_value" ] || param_value="<empty>"
log_info "[qcom_scm-param] $param_name=$param_value"
else
log_info "[qcom_scm-param] $param_name=<not readable>"
fi
done

if [ "$qcom_scm_param_found" -eq 0 ]; then
log_info "[qcom_scm-param] <none>"
fi
else
log_info "qcom_scm parameters: <not exposed>"
fi

if [ -d /sys/module/qcom_scm/drivers ]; then
log_info "qcom_scm driver links:"
qcom_scm_driver_found=0

for driver_link in /sys/module/qcom_scm/drivers/*; do
[ -e "$driver_link" ] || continue
qcom_scm_driver_found=1
log_info "[qcom_scm-driver] ${driver_link##*/}"
done

if [ "$qcom_scm_driver_found" -eq 0 ]; then
log_info "[qcom_scm-driver] <none>"
fi
else
log_info "qcom_scm driver links: <not exposed>"
fi
elif get_kernel_log 2>/dev/null | grep -qi '\bqcom_scm\b'; then
qcom_scm_present=1
log_pass "qcom_scm present in current-boot kernel log."
else
log_info "qcom_scm sysfs node: <not present>; using current-boot kernel log evidence"

get_kernel_log 2>/dev/null |
grep -i '\bqcom_scm\b' |
grep -viE 'Kernel command line|Command line|qcom_scm\.download_mode' |
sed -n '1,10p' |
while IFS= read -r line || [ -n "$line" ]; do
[ -n "$line" ] || continue
log_info "[qcom_scm-kernel-evidence] $line"
done
fi

if [ "$qcom_scm_present" -ne 1 ]; then
log_fail "FAIL: qcom_scm not found in sysfs or current-boot kernel log."
echo "$TESTNAME FAIL" > "$res_file"
exit 0
fi

scm_log="./qcom_scm_kernel.log"
scm_err="./qcom_scm_errors.log"
err_patterns='probe failed|fail(ed)?|error|timed out|not found|invalid|corrupt|abort|panic|oops|unhandled'
log_info "Scanning current-boot kernel log for qcom_scm/shmbridge-related errors"

log_info "Scanning current-boot kernel log for qcom_scm-related errors"
get_kernel_log > "$scm_log" 2>/dev/null || true
grep -iE "qcom_scm.*($err_patterns)" "$scm_log" > "$scm_err" || true
# Avoid stale scanner results from previous manual/local runs.
# These files are generated by scan_dmesg_errors for the current test.
: > ./dmesg_errors.log 2>/dev/null || true
: > ./dmesg_snapshot.log 2>/dev/null || true

if [ -s "$scm_err" ]; then
while IFS= read -r line; do
# Use the repo-standard dmesg scanner, but do not use its return code as the
# test result. The generated dmesg_errors.log is the source of truth here.
#
# This keeps kernel-log triage consistent with other tests while avoiding the
# earlier false failure caused by benign command-line entries such as:
# qcom_scm.download_mode=1 ... panic=-1
scan_dmesg_errors \
"$test_path" \
"qcom_scm|shmbridge|shm_bridge" \
"Kernel command line|Command line|qcom_scm.download_mode|CONFIG_QCOM_SCM" || true

if [ -s ./dmesg_errors.log ]; then
log_fail "FAIL: qcom_scm/shmbridge-related errors detected in current-boot kernel log."
log_info "Filtered qcom_scm/shmbridge kernel errors follow:"
log_info "Source: ./dmesg_errors.log"

while IFS= read -r line || [ -n "$line" ]; do
[ -n "$line" ] || continue
log_info "[kernel] $line"
done < "$scm_err"
log_fail "FAIL: qcom_scm-related errors detected in current-boot kernel log."
log_info "[qcom-scm-dmesg] $line"
done < ./dmesg_errors.log

echo "$TESTNAME FAIL" > "$res_file"
else
log_pass "$TESTNAME : Test Passed (qcom_scm present and no qcom_scm-related kernel errors)"
log_info "Filtered qcom_scm/shmbridge kernel error log: ./dmesg_errors.log is empty"
log_pass "$TESTNAME : Test Passed (qcom_scm present and no qcom_scm/shmbridge-related kernel errors)"
echo "$TESTNAME PASS" > "$res_file"
fi

Expand Down
Loading