xref: /linux/tools/testing/selftests/bpf/progs/kprobe_multi.c (revision f7a11eeccb11185437f4da1c80b66b857d1e906f)
1*f7a11eecSJiri Olsa // SPDX-License-Identifier: GPL-2.0
2*f7a11eecSJiri Olsa #include <linux/bpf.h>
3*f7a11eecSJiri Olsa #include <bpf/bpf_helpers.h>
4*f7a11eecSJiri Olsa #include <bpf/bpf_tracing.h>
5*f7a11eecSJiri Olsa #include <stdbool.h>
6*f7a11eecSJiri Olsa 
7*f7a11eecSJiri Olsa char _license[] SEC("license") = "GPL";
8*f7a11eecSJiri Olsa 
9*f7a11eecSJiri Olsa extern const void bpf_fentry_test1 __ksym;
10*f7a11eecSJiri Olsa extern const void bpf_fentry_test2 __ksym;
11*f7a11eecSJiri Olsa extern const void bpf_fentry_test3 __ksym;
12*f7a11eecSJiri Olsa extern const void bpf_fentry_test4 __ksym;
13*f7a11eecSJiri Olsa extern const void bpf_fentry_test5 __ksym;
14*f7a11eecSJiri Olsa extern const void bpf_fentry_test6 __ksym;
15*f7a11eecSJiri Olsa extern const void bpf_fentry_test7 __ksym;
16*f7a11eecSJiri Olsa extern const void bpf_fentry_test8 __ksym;
17*f7a11eecSJiri Olsa 
18*f7a11eecSJiri Olsa int pid = 0;
19*f7a11eecSJiri Olsa 
20*f7a11eecSJiri Olsa __u64 kprobe_test1_result = 0;
21*f7a11eecSJiri Olsa __u64 kprobe_test2_result = 0;
22*f7a11eecSJiri Olsa __u64 kprobe_test3_result = 0;
23*f7a11eecSJiri Olsa __u64 kprobe_test4_result = 0;
24*f7a11eecSJiri Olsa __u64 kprobe_test5_result = 0;
25*f7a11eecSJiri Olsa __u64 kprobe_test6_result = 0;
26*f7a11eecSJiri Olsa __u64 kprobe_test7_result = 0;
27*f7a11eecSJiri Olsa __u64 kprobe_test8_result = 0;
28*f7a11eecSJiri Olsa 
29*f7a11eecSJiri Olsa __u64 kretprobe_test1_result = 0;
30*f7a11eecSJiri Olsa __u64 kretprobe_test2_result = 0;
31*f7a11eecSJiri Olsa __u64 kretprobe_test3_result = 0;
32*f7a11eecSJiri Olsa __u64 kretprobe_test4_result = 0;
33*f7a11eecSJiri Olsa __u64 kretprobe_test5_result = 0;
34*f7a11eecSJiri Olsa __u64 kretprobe_test6_result = 0;
35*f7a11eecSJiri Olsa __u64 kretprobe_test7_result = 0;
36*f7a11eecSJiri Olsa __u64 kretprobe_test8_result = 0;
37*f7a11eecSJiri Olsa 
38*f7a11eecSJiri Olsa static void kprobe_multi_check(void *ctx, bool is_return)
39*f7a11eecSJiri Olsa {
40*f7a11eecSJiri Olsa 	if (bpf_get_current_pid_tgid() >> 32 != pid)
41*f7a11eecSJiri Olsa 		return;
42*f7a11eecSJiri Olsa 
43*f7a11eecSJiri Olsa 	__u64 addr = bpf_get_func_ip(ctx);
44*f7a11eecSJiri Olsa 
45*f7a11eecSJiri Olsa #define SET(__var, __addr) ({			\
46*f7a11eecSJiri Olsa 	if ((const void *) addr == __addr) 	\
47*f7a11eecSJiri Olsa 		__var = 1;			\
48*f7a11eecSJiri Olsa })
49*f7a11eecSJiri Olsa 
50*f7a11eecSJiri Olsa 	if (is_return) {
51*f7a11eecSJiri Olsa 		SET(kretprobe_test1_result, &bpf_fentry_test1);
52*f7a11eecSJiri Olsa 		SET(kretprobe_test2_result, &bpf_fentry_test2);
53*f7a11eecSJiri Olsa 		SET(kretprobe_test3_result, &bpf_fentry_test3);
54*f7a11eecSJiri Olsa 		SET(kretprobe_test4_result, &bpf_fentry_test4);
55*f7a11eecSJiri Olsa 		SET(kretprobe_test5_result, &bpf_fentry_test5);
56*f7a11eecSJiri Olsa 		SET(kretprobe_test6_result, &bpf_fentry_test6);
57*f7a11eecSJiri Olsa 		SET(kretprobe_test7_result, &bpf_fentry_test7);
58*f7a11eecSJiri Olsa 		SET(kretprobe_test8_result, &bpf_fentry_test8);
59*f7a11eecSJiri Olsa 	} else {
60*f7a11eecSJiri Olsa 		SET(kprobe_test1_result, &bpf_fentry_test1);
61*f7a11eecSJiri Olsa 		SET(kprobe_test2_result, &bpf_fentry_test2);
62*f7a11eecSJiri Olsa 		SET(kprobe_test3_result, &bpf_fentry_test3);
63*f7a11eecSJiri Olsa 		SET(kprobe_test4_result, &bpf_fentry_test4);
64*f7a11eecSJiri Olsa 		SET(kprobe_test5_result, &bpf_fentry_test5);
65*f7a11eecSJiri Olsa 		SET(kprobe_test6_result, &bpf_fentry_test6);
66*f7a11eecSJiri Olsa 		SET(kprobe_test7_result, &bpf_fentry_test7);
67*f7a11eecSJiri Olsa 		SET(kprobe_test8_result, &bpf_fentry_test8);
68*f7a11eecSJiri Olsa 	}
69*f7a11eecSJiri Olsa 
70*f7a11eecSJiri Olsa #undef SET
71*f7a11eecSJiri Olsa }
72*f7a11eecSJiri Olsa 
73*f7a11eecSJiri Olsa /*
74*f7a11eecSJiri Olsa  * No tests in here, just to trigger 'bpf_fentry_test*'
75*f7a11eecSJiri Olsa  * through tracing test_run
76*f7a11eecSJiri Olsa  */
77*f7a11eecSJiri Olsa SEC("fentry/bpf_modify_return_test")
78*f7a11eecSJiri Olsa int BPF_PROG(trigger)
79*f7a11eecSJiri Olsa {
80*f7a11eecSJiri Olsa 	return 0;
81*f7a11eecSJiri Olsa }
82*f7a11eecSJiri Olsa 
83*f7a11eecSJiri Olsa SEC("kprobe.multi/bpf_fentry_tes??")
84*f7a11eecSJiri Olsa int test_kprobe(struct pt_regs *ctx)
85*f7a11eecSJiri Olsa {
86*f7a11eecSJiri Olsa 	kprobe_multi_check(ctx, false);
87*f7a11eecSJiri Olsa 	return 0;
88*f7a11eecSJiri Olsa }
89*f7a11eecSJiri Olsa 
90*f7a11eecSJiri Olsa SEC("kretprobe.multi/bpf_fentry_test*")
91*f7a11eecSJiri Olsa int test_kretprobe(struct pt_regs *ctx)
92*f7a11eecSJiri Olsa {
93*f7a11eecSJiri Olsa 	kprobe_multi_check(ctx, true);
94*f7a11eecSJiri Olsa 	return 0;
95*f7a11eecSJiri Olsa }
96