Introduce kstackwatch_test.sh, a shell script to facilitate running various
test scenarios interactively or via command-line arguments.

Signed-off-by: Jinchao Wang <wangjinchao...@gmail.com>
---
 tools/kstackwatch/kstackwatch_test.sh | 118 ++++++++++++++++++++++++++
 1 file changed, 118 insertions(+)
 create mode 100755 tools/kstackwatch/kstackwatch_test.sh

diff --git a/tools/kstackwatch/kstackwatch_test.sh 
b/tools/kstackwatch/kstackwatch_test.sh
new file mode 100755
index 000000000000..fcdb5ac9b607
--- /dev/null
+++ b/tools/kstackwatch/kstackwatch_test.sh
@@ -0,0 +1,118 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+
+# --- Usage function ---
+usage() {
+       echo "======================================"
+       echo "  KStackWatch Test Script Usage"
+       echo "======================================"
+       echo ""
+       echo "IMPORTANT: Before running, make sure you have updated the offset 
values!"
+       echo ""
+       echo "To find your offsets, use objdump:"
+       echo "  objdump -S --disassemble=canary_test_write vmlinux"
+       echo ""
+       echo "Then search for your function names to find the instruction 
addresses."
+       echo "- Instruction offset: address relative to function's start"
+       echo "- Stack var offset: distance from stack base (%rbp) to the 
variable"
+       echo ""
+       echo "Usage: $0 [test_case_number]"
+       echo ""
+       echo "Available test cases:"
+       echo "  0  - Canary Write Test"
+       echo "  1  - Canary Overflow Test"
+       echo "  2  - Silent Corruption Test"
+       echo "  3  - Recursive Corruption Test"
+       echo ""
+       echo "======================================"
+       echo ""
+}
+
+# --- Interactive menu ---
+show_menu() {
+       echo "Select a test case to run:"
+       echo "  0) Canary Write Test"
+       echo "  1) Canary Overflow Test"
+       echo "  2) Silent Corruption Test"
+       echo "  3) Recursive Corruption Test"
+       echo "  q) Quit"
+       echo ""
+       echo "WARNING: Each test may cause system crash/hang!"
+       echo ""
+       read -p "Enter your choice [0-3/q]: " choice
+       echo ""
+
+       case "$choice" in
+       0) test0 ;;
+       1) test1 ;;
+       2) test2 ;;
+       3) test3 ;;
+       q | Q)
+               echo "Exiting..."
+               exit 0
+               ;;
+       *)
+               echo "Invalid choice. Please try again."
+               echo ""
+               show_menu
+               ;;
+       esac
+}
+
+# --- Test Case 0: Canary Write ---
+test0() {
+       echo "=== Running Test Case 0: Canary Write ==="
+       # function+instruction_off[+depth] [local_var_offset:local_var_len]
+       echo "canary_test_write+0x12" >/proc/kstackwatch
+       echo "test0" >/proc/kstackwatch_test
+       echo >/proc/kstackwatch
+}
+
+# --- Test Case 1: Canary Overflow ---
+test1() {
+       echo "=== Running Test Case 1: Canary Overflow ==="
+       # function+instruction_off[+depth] [local_var_offset:local_var_len]
+       echo "canary_test_overflow+0x12" >/proc/kstackwatch
+       echo "test1" >/proc/kstackwatch_test
+       echo >/proc/kstackwatch
+
+}
+
+# --- Test Case 2: Silent Corruption ---
+test2() {
+       echo "=== Running Test Case 2: Silent Corruption ==="
+       # function+instruction_off[+depth] [local_var_offset:local_var_len]
+       echo "silent_corruption_hapless+0x7f 0:8" >/proc/kstackwatch
+       echo "test2" >/proc/kstackwatch_test
+       echo >/proc/kstackwatch
+}
+
+# --- Test Case 3: Recursive Corruption ---
+test3() {
+       echo "=== Running Test Case 3: Recursive Corruption ==="
+       # function+instruction_off[+depth] [local_var_offset:local_var_len]
+       echo "recursive_corruption_test+0x1b+3 0:8" >/proc/kstackwatch
+       echo "test3" >/proc/kstackwatch_test
+       echo >/proc/kstackwatch
+}
+
+# --- Main ---
+if [ -z "$1" ]; then
+       usage
+       echo ""
+       show_menu
+else
+       case "$1" in
+       0) test0 ;;
+       1) test1 ;;
+       2) test2 ;;
+       3) test3 ;;
+       help | --help | -h) usage ;;
+       *)
+               echo "Error: Invalid argument '$1'"
+               echo ""
+               usage
+               exit 1
+               ;;
+       esac
+fi
-- 
2.43.0


Reply via email to