162306a36Sopenharmony_ci#!/bin/sh
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci# description: Test ftrace direct functions against kprobes
462306a36Sopenharmony_ci# requires: kprobe_events
562306a36Sopenharmony_ci
662306a36Sopenharmony_cirmmod ftrace-direct ||:
762306a36Sopenharmony_ciif ! modprobe ftrace-direct ; then
862306a36Sopenharmony_ci  echo "No ftrace-direct sample module - please build with CONFIG_SAMPLE_FTRACE_DIRECT=m"
962306a36Sopenharmony_ci  exit_unresolved;
1062306a36Sopenharmony_cifi
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ciecho "Let the module run a little"
1362306a36Sopenharmony_cisleep 1
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cigrep -q "my_direct_func: waking up" trace
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cirmmod ftrace-direct
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ciecho 'p:kwake wake_up_process task=$arg1' > kprobe_events
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cistart_direct() {
2262306a36Sopenharmony_ci	echo > trace
2362306a36Sopenharmony_ci	modprobe ftrace-direct
2462306a36Sopenharmony_ci	sleep 1
2562306a36Sopenharmony_ci	grep -q "my_direct_func: waking up" trace
2662306a36Sopenharmony_ci}
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cistop_direct() {
2962306a36Sopenharmony_ci	rmmod ftrace-direct
3062306a36Sopenharmony_ci}
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_cienable_probe() {
3362306a36Sopenharmony_ci	echo > trace
3462306a36Sopenharmony_ci	echo 1 > events/kprobes/kwake/enable
3562306a36Sopenharmony_ci	sleep 1
3662306a36Sopenharmony_ci	grep -q "kwake:" trace
3762306a36Sopenharmony_ci}
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cidisable_probe() {
4062306a36Sopenharmony_ci	echo 0 > events/kprobes/kwake/enable
4162306a36Sopenharmony_ci}
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_citest_kprobes() {
4462306a36Sopenharmony_ci	# probe -> direct -> no direct > no probe
4562306a36Sopenharmony_ci	enable_probe
4662306a36Sopenharmony_ci	start_direct
4762306a36Sopenharmony_ci	stop_direct
4862306a36Sopenharmony_ci	disable_probe
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	# probe -> direct -> no probe > no direct
5162306a36Sopenharmony_ci	enable_probe
5262306a36Sopenharmony_ci	start_direct
5362306a36Sopenharmony_ci	disable_probe
5462306a36Sopenharmony_ci	stop_direct
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci	# direct -> probe -> no probe > no direct
5762306a36Sopenharmony_ci	start_direct
5862306a36Sopenharmony_ci	enable_probe
5962306a36Sopenharmony_ci	disable_probe
6062306a36Sopenharmony_ci	stop_direct
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci	# direct -> probe -> no direct > no noprobe
6362306a36Sopenharmony_ci	start_direct
6462306a36Sopenharmony_ci	enable_probe
6562306a36Sopenharmony_ci	stop_direct
6662306a36Sopenharmony_ci	disable_probe
6762306a36Sopenharmony_ci}
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_citest_kprobes
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci# Now do this with a second registered direct function
7262306a36Sopenharmony_ciecho "Running with another ftrace direct function"
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_cimodprobe ftrace-direct-too
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_citest_kprobes
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_cirmmod ftrace-direct-too
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ciecho > kprobe_events
81