1#!/bin/sh
2# SPDX-License-Identifier: GPL-2.0
3# description: Test ftrace direct functions against kprobes
4# requires: kprobe_events
5
6rmmod ftrace-direct ||:
7if ! modprobe ftrace-direct ; then
8  echo "No ftrace-direct sample module - please build with CONFIG_SAMPLE_FTRACE_DIRECT=m"
9  exit_unresolved;
10fi
11
12echo "Let the module run a little"
13sleep 1
14
15grep -q "my_direct_func: waking up" trace
16
17rmmod ftrace-direct
18
19echo 'p:kwake wake_up_process task=$arg1' > kprobe_events
20
21start_direct() {
22	echo > trace
23	modprobe ftrace-direct
24	sleep 1
25	grep -q "my_direct_func: waking up" trace
26}
27
28stop_direct() {
29	rmmod ftrace-direct
30}
31
32enable_probe() {
33	echo > trace
34	echo 1 > events/kprobes/kwake/enable
35	sleep 1
36	grep -q "kwake:" trace
37}
38
39disable_probe() {
40	echo 0 > events/kprobes/kwake/enable
41}
42
43test_kprobes() {
44	# probe -> direct -> no direct > no probe
45	enable_probe
46	start_direct
47	stop_direct
48	disable_probe
49
50	# probe -> direct -> no probe > no direct
51	enable_probe
52	start_direct
53	disable_probe
54	stop_direct
55
56	# direct -> probe -> no probe > no direct
57	start_direct
58	enable_probe
59	disable_probe
60	stop_direct
61
62	# direct -> probe -> no direct > no noprobe
63	start_direct
64	enable_probe
65	stop_direct
66	disable_probe
67}
68
69test_kprobes
70
71# Now do this with a second registered direct function
72echo "Running with another ftrace direct function"
73
74modprobe ftrace-direct-too
75
76test_kprobes
77
78rmmod ftrace-direct-too
79
80echo > kprobe_events
81