xref: /linux/tools/testing/selftests/bpf/progs/kprobe_multi.c (revision 7f0059b58f0257d895fafd2f2e3afe3bbdf21e64)
1f7a11eecSJiri Olsa // SPDX-License-Identifier: GPL-2.0
2f7a11eecSJiri Olsa #include <linux/bpf.h>
3f7a11eecSJiri Olsa #include <bpf/bpf_helpers.h>
4f7a11eecSJiri Olsa #include <bpf/bpf_tracing.h>
5f7a11eecSJiri Olsa #include <stdbool.h>
6f7a11eecSJiri Olsa 
7f7a11eecSJiri Olsa char _license[] SEC("license") = "GPL";
8f7a11eecSJiri Olsa 
9f7a11eecSJiri Olsa extern const void bpf_fentry_test1 __ksym;
10f7a11eecSJiri Olsa extern const void bpf_fentry_test2 __ksym;
11f7a11eecSJiri Olsa extern const void bpf_fentry_test3 __ksym;
12f7a11eecSJiri Olsa extern const void bpf_fentry_test4 __ksym;
13f7a11eecSJiri Olsa extern const void bpf_fentry_test5 __ksym;
14f7a11eecSJiri Olsa extern const void bpf_fentry_test6 __ksym;
15f7a11eecSJiri Olsa extern const void bpf_fentry_test7 __ksym;
16f7a11eecSJiri Olsa extern const void bpf_fentry_test8 __ksym;
17f7a11eecSJiri Olsa 
18f7a11eecSJiri Olsa int pid = 0;
192c6401c9SJiri Olsa bool test_cookie = false;
20f7a11eecSJiri Olsa 
21f7a11eecSJiri Olsa __u64 kprobe_test1_result = 0;
22f7a11eecSJiri Olsa __u64 kprobe_test2_result = 0;
23f7a11eecSJiri Olsa __u64 kprobe_test3_result = 0;
24f7a11eecSJiri Olsa __u64 kprobe_test4_result = 0;
25f7a11eecSJiri Olsa __u64 kprobe_test5_result = 0;
26f7a11eecSJiri Olsa __u64 kprobe_test6_result = 0;
27f7a11eecSJiri Olsa __u64 kprobe_test7_result = 0;
28f7a11eecSJiri Olsa __u64 kprobe_test8_result = 0;
29f7a11eecSJiri Olsa 
30f7a11eecSJiri Olsa __u64 kretprobe_test1_result = 0;
31f7a11eecSJiri Olsa __u64 kretprobe_test2_result = 0;
32f7a11eecSJiri Olsa __u64 kretprobe_test3_result = 0;
33f7a11eecSJiri Olsa __u64 kretprobe_test4_result = 0;
34f7a11eecSJiri Olsa __u64 kretprobe_test5_result = 0;
35f7a11eecSJiri Olsa __u64 kretprobe_test6_result = 0;
36f7a11eecSJiri Olsa __u64 kretprobe_test7_result = 0;
37f7a11eecSJiri Olsa __u64 kretprobe_test8_result = 0;
38f7a11eecSJiri Olsa 
39*7f0059b5SAlexei Starovoitov extern bool CONFIG_X86_KERNEL_IBT __kconfig __weak;
40*7f0059b5SAlexei Starovoitov 
41f7a11eecSJiri Olsa static void kprobe_multi_check(void *ctx, bool is_return)
42f7a11eecSJiri Olsa {
43f7a11eecSJiri Olsa 	if (bpf_get_current_pid_tgid() >> 32 != pid)
44f7a11eecSJiri Olsa 		return;
45f7a11eecSJiri Olsa 
462c6401c9SJiri Olsa 	__u64 cookie = test_cookie ? bpf_get_attach_cookie(ctx) : 0;
47*7f0059b5SAlexei Starovoitov 	__u64 addr = bpf_get_func_ip(ctx) - (CONFIG_X86_KERNEL_IBT ? 4 : 0);
48f7a11eecSJiri Olsa 
492c6401c9SJiri Olsa #define SET(__var, __addr, __cookie) ({			\
502c6401c9SJiri Olsa 	if (((const void *) addr == __addr) &&		\
512c6401c9SJiri Olsa 	     (!test_cookie || (cookie == __cookie)))	\
52f7a11eecSJiri Olsa 		__var = 1;				\
53f7a11eecSJiri Olsa })
54f7a11eecSJiri Olsa 
55f7a11eecSJiri Olsa 	if (is_return) {
562c6401c9SJiri Olsa 		SET(kretprobe_test1_result, &bpf_fentry_test1, 8);
572c6401c9SJiri Olsa 		SET(kretprobe_test2_result, &bpf_fentry_test2, 7);
582c6401c9SJiri Olsa 		SET(kretprobe_test3_result, &bpf_fentry_test3, 6);
592c6401c9SJiri Olsa 		SET(kretprobe_test4_result, &bpf_fentry_test4, 5);
602c6401c9SJiri Olsa 		SET(kretprobe_test5_result, &bpf_fentry_test5, 4);
612c6401c9SJiri Olsa 		SET(kretprobe_test6_result, &bpf_fentry_test6, 3);
622c6401c9SJiri Olsa 		SET(kretprobe_test7_result, &bpf_fentry_test7, 2);
632c6401c9SJiri Olsa 		SET(kretprobe_test8_result, &bpf_fentry_test8, 1);
64f7a11eecSJiri Olsa 	} else {
652c6401c9SJiri Olsa 		SET(kprobe_test1_result, &bpf_fentry_test1, 1);
662c6401c9SJiri Olsa 		SET(kprobe_test2_result, &bpf_fentry_test2, 2);
672c6401c9SJiri Olsa 		SET(kprobe_test3_result, &bpf_fentry_test3, 3);
682c6401c9SJiri Olsa 		SET(kprobe_test4_result, &bpf_fentry_test4, 4);
692c6401c9SJiri Olsa 		SET(kprobe_test5_result, &bpf_fentry_test5, 5);
702c6401c9SJiri Olsa 		SET(kprobe_test6_result, &bpf_fentry_test6, 6);
712c6401c9SJiri Olsa 		SET(kprobe_test7_result, &bpf_fentry_test7, 7);
722c6401c9SJiri Olsa 		SET(kprobe_test8_result, &bpf_fentry_test8, 8);
73f7a11eecSJiri Olsa 	}
74f7a11eecSJiri Olsa 
75f7a11eecSJiri Olsa #undef SET
76f7a11eecSJiri Olsa }
77f7a11eecSJiri Olsa 
78f7a11eecSJiri Olsa /*
79f7a11eecSJiri Olsa  * No tests in here, just to trigger 'bpf_fentry_test*'
80f7a11eecSJiri Olsa  * through tracing test_run
81f7a11eecSJiri Olsa  */
82f7a11eecSJiri Olsa SEC("fentry/bpf_modify_return_test")
83f7a11eecSJiri Olsa int BPF_PROG(trigger)
84f7a11eecSJiri Olsa {
85f7a11eecSJiri Olsa 	return 0;
86f7a11eecSJiri Olsa }
87f7a11eecSJiri Olsa 
88f7a11eecSJiri Olsa SEC("kprobe.multi/bpf_fentry_tes??")
89f7a11eecSJiri Olsa int test_kprobe(struct pt_regs *ctx)
90f7a11eecSJiri Olsa {
91f7a11eecSJiri Olsa 	kprobe_multi_check(ctx, false);
92f7a11eecSJiri Olsa 	return 0;
93f7a11eecSJiri Olsa }
94f7a11eecSJiri Olsa 
95f7a11eecSJiri Olsa SEC("kretprobe.multi/bpf_fentry_test*")
96f7a11eecSJiri Olsa int test_kretprobe(struct pt_regs *ctx)
97f7a11eecSJiri Olsa {
98f7a11eecSJiri Olsa 	kprobe_multi_check(ctx, true);
99f7a11eecSJiri Olsa 	return 0;
100f7a11eecSJiri Olsa }
101