xref: /linux/tools/testing/selftests/bpf/progs/tracing_multi_check.c (revision 68f4e480b089abae26fbab0c38c3df3cbac3d79d)
1 // SPDX-License-Identifier: GPL-2.0
2 #include <vmlinux.h>
3 #include <bpf/bpf_helpers.h>
4 #include <bpf/bpf_tracing.h>
5 
6 char _license[] SEC("license") = "GPL";
7 
8 int pid = 0;
9 bool test_cookies = false;
10 
11 /* bpf_fentry_test1 is exported as kfunc via vmlinux.h */
12 extern const void bpf_fentry_test2 __ksym;
13 extern const void bpf_fentry_test3 __ksym;
14 extern const void bpf_fentry_test4 __ksym;
15 extern const void bpf_fentry_test5 __ksym;
16 extern const void bpf_fentry_test6 __ksym;
17 extern const void bpf_fentry_test7 __ksym;
18 extern const void bpf_fentry_test8 __ksym;
19 extern const void bpf_fentry_test9 __ksym;
20 extern const void bpf_fentry_test10 __ksym;
21 
22 extern const void bpf_testmod_fentry_test1 __ksym;
23 extern const void bpf_testmod_fentry_test2 __ksym;
24 extern const void bpf_testmod_fentry_test3 __ksym;
25 extern const void bpf_testmod_fentry_test7 __ksym;
26 extern const void bpf_testmod_fentry_test11 __ksym;
27 
28 int tracing_multi_arg_check(__u64 *ctx, __u64 *test_result, bool is_return)
29 {
30 	void *ip = (void *) bpf_get_func_ip(ctx);
31 	__u64 value = 0, ret = 0, cookie = 0;
32 	long err = 0;
33 
34 	if (bpf_get_current_pid_tgid() >> 32 != pid)
35 		return 1;
36 
37 	if (is_return)
38 		err |= bpf_get_func_ret(ctx, &ret);
39 	if (test_cookies)
40 		cookie = bpf_get_attach_cookie(ctx);
41 
42 	if (ip == &bpf_fentry_test1) {
43 		int a;
44 
45 		err |= bpf_get_func_arg(ctx, 0, &value);
46 		a = (int) value;
47 
48 		err |= is_return ? ret != 2 : 0;
49 		err |= test_cookies ? cookie != 8 : 0;
50 
51 		*test_result += err == 0 && a == 1;
52 	} else if (ip == &bpf_fentry_test2) {
53 		__u64 b;
54 		int a;
55 
56 		err |= bpf_get_func_arg(ctx, 0, &value);
57 		a = (int) value;
58 		err |= bpf_get_func_arg(ctx, 1, &value);
59 		b = value;
60 
61 		err |= is_return ? ret != 5 : 0;
62 		err |= test_cookies ? cookie != 9 : 0;
63 
64 		*test_result += err == 0 && a == 2 && b == 3;
65 	} else if (ip == &bpf_fentry_test3) {
66 		__u64 c;
67 		char a;
68 		int b;
69 
70 		err |= bpf_get_func_arg(ctx, 0, &value);
71 		a = (char) value;
72 		err |= bpf_get_func_arg(ctx, 1, &value);
73 		b = (int) value;
74 		err |= bpf_get_func_arg(ctx, 2, &value);
75 		c = value;
76 
77 		err |= is_return ? ret != 15 : 0;
78 		err |= test_cookies ? cookie != 7 : 0;
79 
80 		*test_result += err == 0 && a == 4 && b == 5 && c == 6;
81 	} else if (ip == &bpf_fentry_test4) {
82 		void *a;
83 		char b;
84 		int c;
85 		__u64 d;
86 
87 		err |= bpf_get_func_arg(ctx, 0, &value);
88 		a = (void *) value;
89 		err |= bpf_get_func_arg(ctx, 1, &value);
90 		b = (char) value;
91 		err |= bpf_get_func_arg(ctx, 2, &value);
92 		c = (int) value;
93 		err |= bpf_get_func_arg(ctx, 3, &value);
94 		d = value;
95 
96 		err |= is_return ? ret != 34 : 0;
97 		err |= test_cookies ? cookie != 5 : 0;
98 
99 		*test_result += err == 0 && a == (void *) 7 && b == 8 && c == 9 && d == 10;
100 	} else if (ip == &bpf_fentry_test5) {
101 		__u64 a;
102 		void *b;
103 		short c;
104 		int d;
105 		__u64 e;
106 
107 		err |= bpf_get_func_arg(ctx, 0, &value);
108 		a = value;
109 		err |= bpf_get_func_arg(ctx, 1, &value);
110 		b = (void *) value;
111 		err |= bpf_get_func_arg(ctx, 2, &value);
112 		c = (short) value;
113 		err |= bpf_get_func_arg(ctx, 3, &value);
114 		d = (int) value;
115 		err |= bpf_get_func_arg(ctx, 4, &value);
116 		e = value;
117 
118 		err |= is_return ? ret != 65 : 0;
119 		err |= test_cookies ? cookie != 4 : 0;
120 
121 		*test_result += err == 0 && a == 11 && b == (void *) 12 && c == 13 && d == 14 && e == 15;
122 	} else if (ip == &bpf_fentry_test6) {
123 		__u64 a;
124 		void *b;
125 		short c;
126 		int d;
127 		void *e;
128 		__u64 f;
129 
130 		err |= bpf_get_func_arg(ctx, 0, &value);
131 		a = value;
132 		err |= bpf_get_func_arg(ctx, 1, &value);
133 		b = (void *) value;
134 		err |= bpf_get_func_arg(ctx, 2, &value);
135 		c = (short) value;
136 		err |= bpf_get_func_arg(ctx, 3, &value);
137 		d = (int) value;
138 		err |= bpf_get_func_arg(ctx, 4, &value);
139 		e = (void *) value;
140 		err |= bpf_get_func_arg(ctx, 5, &value);
141 		f = value;
142 
143 		err |= is_return ? ret != 111 : 0;
144 		err |= test_cookies ? cookie != 2 : 0;
145 
146 		*test_result += err == 0 && a == 16 && b == (void *) 17 && c == 18 && d == 19 && e == (void *) 20 && f == 21;
147 	} else if (ip == &bpf_fentry_test7) {
148 		err |= is_return ? ret != 0 : 0;
149 		err |= test_cookies ? cookie != 3 : 0;
150 
151 		*test_result += err == 0 ? 1 : 0;
152 	} else if (ip == &bpf_fentry_test8) {
153 		err |= is_return ? ret != 0 : 0;
154 		err |= test_cookies ? cookie != 1 : 0;
155 
156 		*test_result += err == 0 ? 1 : 0;
157 	} else if (ip == &bpf_fentry_test9) {
158 		err |= is_return ? ret != 0 : 0;
159 		err |= test_cookies ? cookie != 10 : 0;
160 
161 		*test_result += err == 0 ? 1 : 0;
162 	} else if (ip == &bpf_fentry_test10) {
163 		err |= is_return ? ret != 0 : 0;
164 		err |= test_cookies ? cookie != 6 : 0;
165 
166 		*test_result += err == 0 ? 1 : 0;
167 	} else if (ip == &bpf_testmod_fentry_test1) {
168 		int a;
169 
170 		err |= bpf_get_func_arg(ctx, 0, &value);
171 		a = (int) value;
172 
173 		err |= is_return ? ret != 2 : 0;
174 
175 		*test_result += err == 0 && a == 1;
176 	} else if (ip == &bpf_testmod_fentry_test2) {
177 		int a;
178 		__u64 b;
179 
180 		err |= bpf_get_func_arg(ctx, 0, &value);
181 		a = (int) value;
182 		err |= bpf_get_func_arg(ctx, 1, &value);
183 		b = (__u64) value;
184 
185 		err |= is_return ? ret != 5 : 0;
186 
187 		*test_result += err == 0 && a == 2 && b == 3;
188 	} else if (ip == &bpf_testmod_fentry_test3) {
189 		char a;
190 		int b;
191 		__u64 c;
192 
193 		err |= bpf_get_func_arg(ctx, 0, &value);
194 		a = (char) value;
195 		err |= bpf_get_func_arg(ctx, 1, &value);
196 		b = (int) value;
197 		err |= bpf_get_func_arg(ctx, 2, &value);
198 		c = (__u64) value;
199 
200 		err |= is_return ? ret != 15 : 0;
201 
202 		*test_result += err == 0 && a == 4 && b == 5 && c == 6;
203 	} else if (ip == &bpf_testmod_fentry_test7) {
204 		err |= is_return ? ret != 133 : 0;
205 
206 		*test_result += err == 0;
207 	} else if (ip == &bpf_testmod_fentry_test11) {
208 		err |= is_return ? ret != 231 : 0;
209 
210 		*test_result += err == 0;
211 	}
212 
213 	return 0;
214 }
215